2010-02-08 35 views
13

xin lỗi trước nếu tôi sử dụng thuật ngữ kém.Cách nhận cảnh báo về định dạng chuỗi không chính xác (C++)

khi tôi biên dịch C++ ứng dụng dưới gdb và sử dụng printf() nó mang lại cho tôi tuyệt vời cảnh báo liên quan đến sự phù hợp của các chuỗi định dạng và các đối số được thông qua vào

ví dụ, mã này:.

printf("%s %s", "foo"); 

dẫn đến cảnh báo trình biên dịch "quá ít đối số cho định dạng", điều này cực kỳ hữu ích. nó cũng sẽ đưa ra cảnh báo về loại chuỗi định dạng so với loại đối số. nó phải kiểm tra chuỗi định dạng và so sánh với chuỗi đối số được cung cấp. - là loại nội dung biên dịch thời gian biên dịch nào đó có thể được thêm vào mã nguồn thông thường hay đó là thứ cần được biên dịch thành chính gcc?

fwiw đây là dưới gcc 4.2.1 trên os x.

Trả lời

9

Bạn có thể làm những thứ như thế này cho riêng chức năng printf giống như của bạn (cũng như cho scanf/strftime/strfmon giống như chức năng):

#define PRINTF_FORMAT_CHECK(format_index, args_index) __attribute__ ((__format__(printf, format_index, args_index))) 

void my_printf(const char *fmt, ...) PRINTF_FORMAT_CHECK(1, 2); 

Xem gcc manual để biết thêm chi tiết.

+3

Có một loạt các tùy chọn khác trong sổ tay; họ không thể đủ để trang trải trường hợp chung của tất cả các hàm variadic. –

+2

huh; tiện lợi. cảm ơn Paul. từ trang người đàn ông: "Thuộc tính định dạng chỉ định rằng một hàm nhận các đối số kiểu printf, scanf, strftime hoặc strfmon cần được kiểm tra kiểu đối với chuỗi định dạng" . ví dụ như một cái gì đó khác hơn là printf-gia đình của các chức năng) điều này sẽ không thực sự làm các trick, nhưng có một bó toàn bộ __attributes__ thú vị khác trong trang bạn liên kết đến. cảm ơn ! –

+0

Tuyệt vời. Bất cứ ai biết nếu trình biên dịch Intel C có một cái gì đó tương tự? Tôi không thể tìm thấy bất kỳ thứ gì trong sách hướng dẫn. – pavon

Các vấn đề liên quan