2012-11-16 2 views
0

Вызов printf внутри подфункции приводит к нарушению доступа.Нарушение прав доступа printf в подфункции - Ansi C90

Программа довольно огромная по размеру. но я смог изолировать проблему до такой степени, что был сделан только вызов подфункции.

Я могу сбой системы, вызывая printf с такой постоянной константой: printf («test»). Некоторые другие люди также имели доступ к нарушениям, предоставляя странный объект printf - здесь это не так.

Вот некоторые псевдокод:

subfunction() 
{ 
    printf("all works great"); //Access Violation 

    //some other calls here 
} 

void main() 
{ 
    otherfunctions(); // 
    printf("all works great"); 
    subfunction();   
    //some more calls here 
} 

С моей stachtrace:

msvcr100d.dll!_chkstk() 
msvcr100d.dll!_write(int fh, const void * buf, unsigned int cnt) 
msvcr100d.dll!_flush(_iobuf * str) 
msvcr100d.dll!_ftbuf(int flag, _iobuf * str) 
msvcr100d.dll!printf(const char * format, ...) 

Кодекс находится в C90 кода и компилирует с VS2010. Его следует рассматривать как C90. Это произошло после рефакторинга, где все _ (v) snprintf были заменены на их _ (v) snprintf_s. Я не уверен, оказало ли это влияние.

Я думаю, что буфер становится покрасневшим, прежде чем что-либо записано в него.

Как я могу исследовать это дальше? Какие системные настройки могли бы использовать мой другой код для сбоя printf?

+0

Вы, вероятно, повреждение стека где-то в другом месте. Мне кажется, этот код мне подходит. Попробуйте использовать инструмент анализа динамического кода для отслеживания нарушений доступа. Также попробуйте запустить код, используя «Debug» в VS –

ответ

0

Ошибка была в том, что я ожидал, что printf напечатает строку, но на самом деле передал ей строку.

Для Ansi-C Обычно я пишу структуру для инкапсулирования строк.

typedef struct TString{ 
    char buffer[2000]; 
}TString; 

Я обычно пишу:

void mistake(void){ 
    TString str; 
    TStrnig_Construct(&str); 
    prtinf("%s", str); 
    TString_Destuct(&str); 
} 

Это трудно обнаружить для меня, так как она на самом деле выглядит ул строка. В действительности str не является строкой, а структурой. Эта ошибка может проявляться в любом месте, особенно если содержимое структуры расширяется с другой информацией (например, size_t size).

я должен был бы написать:

void corrected(void){ 
    TString str; 
    TStrnig_Construct(&str); 
    prtinf("%s", str.buffer); 
    TString_Destuct(&str); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^