2009-03-21 17 views
6

Bạn có biết làm thế nào tôi có thể làm cho nẹp bỏ qua nơi tôi khai báo các biến của tôi?Làm thế nào tôi có thể làm cho nẹp bỏ qua nơi tôi khai báo các biến của tôi?

Tôi biết rằng trường cũ c yêu cầu bạn khai báo các biến ngay tại bắt đầu trong mọi hàm, nhưng vì tôi là người xấu, tôi muốn khai báo những thứ gần nơi tôi sử dụng chúng. Một ví dụ tốt là đặt int i; ngay trước khi cho (i = 0; ...).

Hãy lấy một ví dụ rất đơn giản

#include <stdio.h> 
int main() 
{ 
    printf("Hello splint test\n"); 

    int i; 
    for(i=5;i>0;i--) 
    { 
     printf("%2d...\n",i); 
    } 

    return 0; 
} 

đây nẹp và trình biên dịch c cũ nhất muốn di chuyển int i; lên một dòng, hoặc đặt {} làm tròn tờ khai và vòng lặp for.

Và bây giờ cho câu hỏi, làm cách nào để tắt kiểm tra này? Nhưng giữ các kiểm tra khác tốt?

Cảm ơn Johan


Lưu ý 1: Tôi đã sử dụng cảnh báo gcc (xem bên dưới) như là một dòng đầu tiên ra khỏi phòng, và valgrind là thứ hai. Nhưng tôi đang nghĩ về việc thêm nẹp vào danh sách của tôi về những điều mà có thể kiểm soát sự ngu dốt của tôi ;-) Nhưng việc kiểm tra này chỉ là gây phiền nhiễu,

Những cảnh báo gcc tôi sử dụng: Wall -W -Wextra -Wconversion - Wshadow -Wcast-qual -Wwrite-strings -Werror

Lưu ý 2: Tôi biết về các vấn đề về khả năng di động có thể đến từ hành vi xấu đó. Nhưng tôi cảm thấy rằng nó làm tăng khả năng đọc, còn không cần phải nhảy lên và xuống để tìm kiếm loại khai báo này có giá trị hơn (và điều này chúng ta có thể thảo luận trong một chủ đề khác).


Cập nhật: Một chút biết thêm thông tin, tôi đặt mã trên trong một tập tin gọi là main.c. vBulletin sử dụng là Ubuntu 8.04 và gvim như biên tập viên, và điều này là kết quả từ nẹp khi tôi chạy nó:

splint +gnuextensions main.c 
Splint 3.1.1 --- 03 Nov 2006 

Command Line: Setting +gnuextensions redundant with current value 
main.c:8:8: Parse Error. (For help on parse errors, see splint -help 
       parseerrors.) 

Và điều này mở ra thêm 2 câu hỏi mà tôi đã không nghĩ về trước.

  1. "dư thừa với giá trị hiện tại", giá trị hiện tại là gì?

  2. Tại sao lỗi phân tích cú pháp và không phải là cảnh báo?


Cập nhật:: Có một posibility để nẹp vá để hỗ trợ vấn đề này, Tôi đã không cố gắng này nhưng chưa nhưng tôi nghĩ rằng nó là giải pháp.

+1

Trong khi bạn ở đó, bạn nên khai báo int bên trong câu lệnh. – starblue

+0

Bạn có nhận được cảnh báo gây phiền nhiễu hoặc lỗi phân tích cú pháp không? –

+0

và đó là khoảng cách giữa "int" và "i" phá vỡ nẹp? – Johan

Trả lời

7

Dưới đây là một bản vá: http://www.cs.virginia.edu/pipermail/splint-discuss/attachments/20080718/52cc25f6/attachment.obj

Bạn sẽ có thể để nuôi rằng thông qua -p2 vá nếu bạn đang ở trong thư mục nẹp/src, và sau đó nó chỉ nên xây dựng lại.

Đó là từ email này: (. Xin lỗi về khoảng cách trên đó) http://www.cs.virginia.edu/pipermail/splint-discuss/2008-July/001190.html

Bạn sẽ thấy rằng cuối cùng nếu bạn làm theo các starblue chủ đề liên quan đến, nhưng tôi nghĩ rằng tôi muốn nhảy để kết thúc cho bạn.

Nẹp dường như không có người bảo trì ngay bây giờ, thật không may. Tôi sẽ xem xét việc tăng cường và làm thêm một số nếu tôi không quá bận rộn.

Jake

+0

Tôi vừa thử áp dụng miếng vá đó cho các nguồn nẹp 3.1.2. Tôi đã nhận được lỗi cú pháp khi tôi cố gắng xây dựng nó. Tôi cũng có lỗi cú pháp khi tôi cố gắng xây dựng nẹp 3.1.2 * mà không cần * bản vá. –

2

Thông thường, với nẹp, nếu có điều gì có thể dập tắt nó sẽ nói "ngăn chặn điều này với + thisflag hoặc -thisflag"

Bạn có thể thử nẹp + gnuextensions foo.c, mà quay về (hầu hết) GNU/GCC các phần mở rộng mà nẹp sẽ có vấn đề với.

Tôi sử dụng nẹp gần như thường xuyên như tôi sử dụng valgrind.

Edit:

Như những người khác đã nói, chạy vào phân tích cú pháp (không phải là phân tích), vì vậy cờ thực sự sẽ không giúp đỡ trong trường hợp này.

+0

- "Dòng lệnh: Thiết lập + gnuextensions dư thừa với giá trị hiện tại", có điều gì đó đang chặn. – Johan

3

Tôi không quen thuộc với thanh nẹp, nhưng từ their FAQ:

Splint là độc lập với trình biên dịch của bạn. Nó kiểm tra mã C chuẩn, theo tiêu chuẩn ISO C99 . Splint hỗ trợ hầu hết, nhưng không phải tất cả, của các phần mở rộng C99 đến ANSI C. Splint hỗ trợ một số phần mở rộng trình biên dịch gcc (nếu + gnuextensions được sử dụng).

Vị trí khai báo của bạn tuân thủ hoàn toàn theo C99, vì vậy có lẽ bạn có thể coi đây là lỗi trong nẹp. Hoặc đó là một trong những "phần mở rộng" chưa được hỗ trợ bởi nẹp. Dù bằng cách nào họ cũng có thể quan tâm đến phản hồi của bạn. Không nên có lý do cho một công cụ lint tuân thủ C99 để khiếu nại về các khai báo biến.

5

This thread trên danh sách gửi thư Splint thảo luận vấn đề.

Dường như trình phân tích cú pháp chủ yếu là C89/C90, chỉ thư viện có vẻ là C99.

Vì vấn đề là với trình phân tích cú pháp, bạn không thể làm cho nó biến mất bằng cách đặt cờ.

+1

Tôi nghĩ rằng bạn là chính xác, tuy nhiên tôi gửi một thư đến danh sách đó để tìm hiểu. http://www.cs.virginia.edu/pipermail/splint-discuss/2009-March/001288.html Hãy xem điều gì xảy ra. – Johan