Ошибка утверждения в CRT, вызывающем _osfile () в VS 2008? - PullRequest
5 голосов
/ 13 мая 2011

У меня есть база кода C ++, которая работает в течение длительного времени.Кодовая база представляла собой устаревший набор проектов VS 2003, который я недавно перенес на VS 2008. Миграция оказалась успешной в том, что полученная программа была собрана и запущена.

Я переустановил свою ОС и все приложения нановый диск, и теперь, когда я пытаюсь отладить программу в отладчике, я получаю ошибку подтверждения внутри CRT chsize (на самом деле, _chsize_s).В частности (обрезано до базовых, игнорируя проверки безопасности):

FILE * testfile = fopen("P:\\_Dan\\local\\foogoo.txt", "w");
int filehandle = fileno(testfile);
chsize(filehandle, 0);
fwrite("goohoo", 1, 6, testfile);
fclose(testfile);

Утверждение об отладке происходит в пределах chsize - в частности, в файле исходного кода CRT chsize.c, в следующей строке:

 _VALIDATE_CLEAR_OSSERR_RETURN_ERRCODE((_osfile(filedes) & FOPEN), EBADF);

... где filedes соответствует filehandle.

Возможно, проблема заключается в том, что в новой системе не установлена ​​более старая версия VS (только VS 2008), посколькунекоторым сторонним библиотекам требуется распространяемый VS 8.0 - даже если на старой системе все складывается и работает нормально с использованием VS 2008. Поэтому я установил VS 2005 (а не 2003).Тем не менее проблема продолжает возникать.

Любые предложения будут очень приветствуются.

* Обновление - проблема не связана с chsize.Смотрите мой ответ ниже.

Ответы [ 2 ]

4 голосов
/ 15 мая 2011

Проблема решена - и не связана с chsize. Для модели связывания с библиотеками c-runtime, выбранной для генерации кода, была установлена ​​многопоточная отладка (/ MTd) для основного проекта, но многопоточная отладочная DLL (/ MDd) для всех проектов в решении, с которым она связана к. Переход на / MDd решил проблему.

Я знаком с этими проблемами компоновки и, как правило, стараюсь их правильно настроить, но, поскольку это было обновление рабочего проекта с более ранней версии Visual Studio без изменений, я не думал смотреть в эту сторону. Я не исследовал, как или почему параметр был изменен (или даже если он был установлен таким образом в предыдущей версии, но не вызывал проблем).

1 голос
/ 30 июня 2013

Нашел эту проблему и в моем коде. Основная программа должна быть связана с общей библиотекой, которая собирается с помощью MT. Когда обработчик файла, открытый в основной программе, передается в функцию совместно используемой библиотеки, _VALIDATE_RETURN ((_ osfile (fh) & FOPEN), EBADF, -1) в setmode.c CRT завершает работу программы.

Отладка _osfile в режиме сборки, обработчик файла поиска osfile в таблице __pioinfo (01802EEDB0h). Ну, это фиксированная область в статически связанных ЭЛТ. И еще одна __pioinfo в основной программе - это другой адрес 01E619540h. Одним словом, если двум модулям необходимо совместно использовать глобальные данные, нельзя строить с моделью MT.

Я просто хочу оптимизировать разделяемую библиотеку с помощью статической компиляции, могут возникнуть некоторые трудно заметные ошибки. Кажется, что в большинстве случаев сила GCC разделена или статична.

...