Главная страница


ru.unix.bsd

 
 - RU.UNIX.BSD ------------------------------------------------------------------
 From : Andrey Kotrekhov                     2:5020/400     07 Jan 2005  03:05:29
 To : All
 Subject : [q] баг или я глючу
 -------------------------------------------------------------------------------- 
 
 Добрый день всем!
 
 Была прога, никого не трогала, работала c STL
 С переходом на FreeBSD-5.3 начала падать.
 Поиск проблемы привел вот к такому простому тестику, который падает 
 непонятно почему.
 Причем не падает, когда приложение собрано с -O2
 и падает, когда не задаешь -О вообще.
 При порождении единственного треда падает гораздо раньше, если Run() 
 выполняем в main тогда
 живет дольше, но падает все равно регулярно при одном и том же кол-ве 
 итераций.
 
 Падает при  задании несуществующего ключа в map, при этом вызывается 
 исключение, которое перехватывается.
 При существующем ключе все живет.
 Где грабли?
 
 $ gcc -v
 Using built-in specs.
 Configured with: FreeBSD/i386 system compiler
 Thread model: posix
 gcc version 3.4.2 [FreeBSD] 20040728
 Тестилось на FreeBSD 5.3 5.2.1 - падает.
 на линуксе с gcc 3.3.3 не падает.
 =============================================
 
   #include <pthread.h>
 #include <map>
 #include <string>
 #include <iostream>
 #include <stdexcept>
 using namespace std;
 
 class B {
      private:
          int a;
      public:
          B() {
              a=1;
          }
          int size() { return 2; }
 };
 
 class A : public map<string, B> {
      public:
          virtual B& operator[] (const string& k) throw (int);
 };
 
 B& A::operator[] (const string& k) throw (int) {
      iterator point;
 
      if ((point=find(k))==end()) {
          throw int(1);
      }
      return point->second;
 }
 
 A aa;
 
 void * Run(void *n) {
      int i=0;
      //struct timespec rqtp = {0, 1000};
      while (true) {
          try {
              cout << "xxx=" << aa["xxx"].size() << endl;
          }
          catch(...) {
              cout << "exception" << endl;
          }
          //nanosleep(&rqtp, NULL);
          try {
              cout << i++ << endl;
          }
          catch(...) {
              cout << "exeption in cout" << endl;
          }
      }
      return NULL;
 }
 int main() {
      aa.insert(make_pair("aaa",B()));
      aa.insert(make_pair("bbb",B()));
 
      pthread_t pt;
      pthread_create(&pt, NULL,
           Run, NULL);
      pthread_join(pt, NULL);
  
  
 
 //    Run(NULL);
 }
 
 --
 Андрей
 --- ifmail v.2.15dev5.3
  * Origin: Alkar Teleport News Server (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 [q] баг или я глючу   Andrey Kotrekhov   07 Jan 2005 03:05:29 
 Re: [q] баг или я глючу   Andrey Kotrekhov   08 Jan 2005 18:46:16 
Архивное /ru.unix.bsd/13297b6787a80.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional