Борьба со спринтом ... что-то глупое? - PullRequest
5 голосов
/ 12 апреля 2011

Извините, что приставал ко всем, но это причиняет мне некоторую боль. Вот код:

char buf[500];
sprintf(buf,"D:\\Important\\Calibration\\Results\\model_%i.xml",mEstimatingModelID);

mEstimatingModelID является целым числом, в настоящее время содержит значение 0.

Достаточно просто, но отладка показывает, что это происходит:

0x0795f630 "n\Results\model_0.xml"

т.е. в нем отсутствует начало строки.

Есть идеи? Это простые вещи, но я не могу понять это.

Спасибо!

1 Ответ

3 голосов
/ 14 апреля 2011

Чтобы сделать это фактическим общим ответом: Вот контрольный список для похожих ошибок:

  • Никогда не доверяйте тому, что вы видите в режиме выпуска, особенно локальным переменным, которые были выделены изстека памяти.Статические переменные, которые существуют в кучных данных, являются единственной вещью, которая, как правило, будет правильной, но даже в этом случае ей не следует доверять.(Это было в случае с пользователем выше). По моему опыту, более поздние версии VS имеют менее надежные данные режима выпуска (вероятно, потому что они оптимизируют намного больше при выпуске, или, может быть, это 64-разрядность или что-то в этом роде)

  • Всегда проверяйте, проверяете ли вы переменную в правильной функции.Очень просто иметь переменную с именем "buf" в вышестоящей функции, в которой есть неинициализированный мусор.Это было бы легко спутать с переменной с таким же именем в нижней подпрограмме / функции.

  • Это всегда хорошая идея, чтобы дважды проверить переполнение буфера.Если вы когда-либо используете% s в вашем sprintf, вы могли бы получить переполнение буфера.

  • Проверьте ваши типы.sprintf довольно легко адаптируется, и вы можете легко получить безошибочный, но странный результат, передавая строковый указатель, когда ожидается int и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...