Странное условие со статической переменной var, которое появляется только в отладочных сборках gcc - PullRequest
2 голосов
/ 19 декабря 2010

У меня странное условие, которое появляется только в выходных данных gcc -O0 -g, а не в gcc -O3, не в MSVC, не в выходных данных отладки MSVC.

void func(void) {
  static int enabled;

  if (!enabled) {
    // do stuff
    enabled = 1;
   }

}

Проблема, которая появляется в gcc-O0 -g только в том случае, если иногда включено возвращается к 0. Но не всегда, только в некоторых редких моментах выполнения программы.Функция проходит через это вообще.Что может заставить его запутаться?Может ли это «включено» быть изменены внешне?Но оно объявлено внутри него.

РЕДАКТИРОВАТЬ: есть способ установить для него значение 0 внутри функции, но ему предшествует большой жирный printf, который вообще не печатается [и нет логического способачтобы это вообще произошло в условиях испытаний.Похоже, что он вообще не идет ни к чему, что явно делает enabled = 0.

EDIT2: он вызывается только основным потоком.

EDIT3: он становится более причудливым.Он не отображается в linux gcc -O0 -g, а только в mingw-w64 [gcc -O0 -g].

РЕДАКТИРОВАТЬ4: Появились часы с включенными часами и часами, чтобы показать, что они изменяются в некоторых случаях if (! Enabled) (которое должно быть только для чтения).

EDIT5: После помощи от #mingw-w64 при значении oftc кажется, что он «исправляет», если «булева последовательность» перевернута, например, enable инициализируется в 1, а затем устанавливается в 0. «Инициализируя статическую переменную ненулевым значением, помещает ее в раздел .data»«Так что есть проблема с lcomm» «Я предполагаю, что у вас есть переполнение буфера в другом месте вашего кода» *

1 Ответ

5 голосов
/ 19 декабря 2010

Мое предположение: у вас где-то переполнение буфера.Переменная, которая находится в основной памяти прямо перед enabled, перезаписывается с неправильным размером, перезаписывая все после нее.В качестве альтернативы, у вас есть блуждающий указатель, который перезаписывает его.

Единственный полезный способ отладки - это добавить точку наблюдения в gdb, как предлагает thkala.

...