C++ w MS Visual Studio 2008. Poziom ostrzeżenia 4 plus ładunek dodatkowych ostrzeżeń również włączony. Spodziewam się, że to ostrzeżenie: co najmniej, ale bardziej prawdopodobny błąd kompilatora?Dlaczego/jak to się kompiluje?
deklaracji funkcji jest następująca:
int printfLikeFunction(
const int bufferLength,
char * const buffer,
const char * const format,
...);
wykorzystanie kodu - jest literówka: chociaż ARRAY_SIZE z outputBuffer jest przekazywana sama outputBuffer nie jest - na pewno nie powinno to skompilować:
printfLikeFunction(ARRAY_SIZE(outputBuffer), "Format: %s, %s", arg1, arg2);
Oczywiście jest to błędne i popełniono błąd. Jednak powinien go złapać kompilator! Parametr buffer powinien być wskaźnikiem znaków i przekazywany jest literał łańcuchowy, który jest const char-pointer. To musi być błąd. (arg1 i arg2 są również (prawdopodobnie const) znakami, tak więc deklaracja jest dopasowywana nawet bez outputBuffer znajdującego się we właściwym miejscu).
W czasie wykonywania ten kod ulega awarii podczas próby zapisu w literale łańcuchowym. Nic dziwnego, po prostu nie rozumiem, w jaki sposób można było je skompilować.
(Chociaż, przypuszczalnie, jest to przypuszczalnie, dlaczego sprintf_s ma parametry bufora i rozmiaru w innej kolejności niż ta funkcja - powoduje, że takie błędy jednoznacznie zawodzą).
Wow. Cóż za zwariowana decyzja! Ale tak, właśnie sprawdziłem Standard i masz absolutną rację. Nie do wiary! –
Można mieć nadzieję, że Visual Studio wyświetli ostrzeżenie, gdy będzie używać przestarzałych i zwariowanych funkcji standardu. –
Tak ... nawet jeśli "szaleństwo" jest subiektywne, przestarzałe nie jest, więc zadziwia mnie, że nie spowodowało to ostrzeżenia. –