2009-04-21 7 views
5

Có một lá cờ cho gcc sao cho các chuyển đổi từ dài đến ngắn sẽ tạo ra cảnh báo về khả năng mất dữ liệu?Có cảnh báo gcc 4.2 tương tự như Visual Studio liên quan đến việc mất dữ liệu không?

Tôi đang làm việc trên ứng dụng C++ được biên dịch cho cả Visual Studio (2005) và GCC 4.2 (dành cho Mac OS X).

Những cảnh báo rằng Visual Studio in ra theo mô hình này:

: warning C4244: 'argument' : conversion from 'long' to 'short', possible loss of data 

Tôi đã thử -Wconversion, nhưng đó không phải là khá những gì tôi đang tìm kiếm. Điều duy nhất tôi đã có thể tìm thấy cho đến nay là một lá cờ thử nghiệm, -Wcoercion, được liên kết với GCC 4.3 (mà tôi không chắc chắn nếu chúng ta muốn đầu tư khá).

ngày 22 tháng 4 năm 2009 @ 11:00 EST Chỉnh sửa: Để làm rõ, tôi muốn thấy cảnh báo đó. Chúng tôi có mã nơi chúng tôi muốn biết khi nào mất dữ liệu sẽ xảy ra. Nếu tôi có mã:

unsigned long value1 = LONG_MAX; 
std::cout << "value1: " << value1 << std::endl; 

unsigned short value2 = value1; 
std::cout << "value2: " << value2 << std::endl; 

tôi nhận được kết quả mong đợi này:

    value1: 2147483647
    value2: 65535

Trong mã của chúng tôi, chúng tôi có đặc biệt khẳng định đưa ra tại chỗ thực hiện cưỡng chế và cảnh báo chúng ta nếu mã thực hiện sẽ dẫn đến mất dữ liệu. Chúng tôi tìm thấy các địa điểm trong cơ sở mã lớn của chúng tôi bằng cách sử dụng cảnh báo của Visual Studio.

Có cách nào để chúng tôi có thể tạo các cảnh báo này trong gcc 4.2 không?

Trả lời

4

Tính năng này không được hỗ trợ trong GCC 4.2, nhưng nó đã được thêm vào trong GCC 4.3. Wiki page explaining it.

Nhờ schnaader và Evan Teran đã cung cấp các liên kết dẫn tôi đến đó.

+1

Để xác thực mất dữ liệu có thể, hãy thử '-Wshorten-64-to-32'. '-Wconversion' cũng sẽ kiểm tra các lỗi đã ký (có thể là quá mức cần thiết). – rustyx

+0

'-Wshorten-64-to-32' không được GCC chấp nhận, chỉ bởi Clang. – Andy

4

Nhìn vào điều này GCC bug entry, có lẽ nó giúp hiểu tại sao chuyển đổi từ dài sang ngắn không dẫn đến cảnh báo.

+3

tốt hơn, hãy làm theo liên kết trong mục nhập lỗi đó: http://gcc.gnu.org/wiki/Wcoercion –

+0

Điều này không thực sự trả lời câu hỏi của tôi. Nhưng cảm ơn vì đã tìm kiếm. –

4

Sử dụng -Wconversion. Bạn dường như cần điều này ngay cả khi bạn đã chỉ định -Wall.

Nó chắc chắn hoạt động trong gcc4.3. Nếu nó không được sửa bởi phiên bản 4.2, bạn sẽ phải nâng cấp để có được nó.

Ví dụ cảnh báo:

warning: conversion to 'short int' from 'int' may alter its value