這段代碼有什麼問題?EXC_BAD_ACCESS當調用vprintf()
#include <stdio.h>
#include <stdarg.h>
void myprintf(const char * format, ...) __printflike(1, 2);
int main(int argc, const char * argv[]) {
printf("%s\n");
myprintf("%s\n");
return 0;
}
void myprintf(const char * format, ...) {
if (format) {
va_list arguments;
va_start(arguments, format);
vprintf(format, arguments);
va_end(arguments);
}
}
通過使用__printflike
我得到一個不錯的警告,就像printf
。但不同於printf
,其中至少打印垃圾,我得到EXC_BAD_ACCESS在調用vprintf
如下所示:
有沒有什麼辦法可以使這項工作? 謝謝!
更新:我的理解是通過調用數錯誤的參數的函數得到了一個未定義的行爲,但我想myprintf
表現就像printf
做(沒有崩潰)。那可能嗎?在撥打vprintf
以避免異常之前,有什麼方法可以檢查參數嗎?
UPDATE 2:我想我現在明白了,感謝所有的評論和回答。對於這個非常簡單的例子,我認爲是更好地使用宏,這向主叫點未能快速和崩潰:
「printf,它至少打印垃圾」。這不是保證的行爲。當您故意將代碼中的錯誤添加到具有未定義行爲的代碼中時,您無法期望它「至少打印垃圾」。 UB意味着行爲是不可預測的。它可以立即崩潰,它可以後來崩潰,它可以打印垃圾,它可以打印什麼,... – kaylum
[是否「未定義行爲」真的允許*發生任何事情?](http://stackoverflow.com/questions/ 32132574/does-undefined-behavior-really-permit-anything-to-happen) – kaylum
@kaylum我更新了我的問題,因爲我想知道是否有一種方法可以讓我的函數的行爲像'printf',在它的未定義的方式。從你的角度來看...如果調用者傳遞錯誤的參數就足夠了,那麼記錄該行爲是不確定的?謝謝! – cromandini