如果在参数列表中使用了另一个typedef类型的名称,则发出警告

时间:2015-06-19 06:49:28

标签: c gcc

考虑一个大型项目,其中许多类型为typedef'd,例如

typedef int age;
typedef int height;

和一些函数获取这些类型的参数:

void printPerson(age a, height h) {
    printf("Age %d, Height %d\n", a, h);
}

如果这些参数的类型错误,有没有办法在编译时发出警告,例如

age a = 30;
height h = 180;
printPerson(h, a); /* No warning, because a and h are both integers */

在这种情况下,gcc(或某些静态代码分析工具)是否有选项可以发出警告?

6 个答案:

答案 0 :(得分:6)

GCC中没有内置支持。

根据Sparse nocast属性添加a feature request。但是,这还没有实施。但是,如果您可以使用Sparse,则可以通过使用__attribute__((nocast))标记每个typedef来执行此操作。

在C ++中,您可以通过创建包装类而不是typedef来完成此操作,然后只是不为它们定义隐式转换。

答案 1 :(得分:2)

Klocwork有一些与他们称之为“强类型”相关的检查。

对于您的代码,它会抛出STRONG.TYPE.ASSIGN.ARG,因为参数类型不匹配。

它还抱怨将int值(对象)分配给ageheight类型变量,以及将变量用作int中的printf

我听说它很贵。

答案 2 :(得分:2)

正如其他回复所表明的那样,你不会从gcc免费获得这个。你肯定是进入静态分析工具的世界来解决这个问题。

对此有一些建议,其中一些需要额外的注释,其中一些不是,但可能比你正在寻找的更多。因此,我认为我还要再投入一个......

对我来说,长期以来一直是各种命令行lint工具。在您的情况下,我认为PC-lint / flexelint非常适合即使它是一个商业工具。请参阅here进行强类型检查。

答案 3 :(得分:0)

不,不可能。如果您正在做(或即将做)非法的事情,编译器会发出警告。它不应该知道(或确定)将作为函数参数传递的的正确性。只要类型相同,就没有任何理由抱怨。

但是,如果类型不匹配,它会提醒您。

答案 4 :(得分:0)

仅在类型不同时才会生成错误。你可以将这些类型包装在struct中,并使用宏来自动定义和赋值。

如果您愿意使用枚举而不是整数,则可以选择在名为coverity的静态代码分析工具中使用混合枚举时发出警告。

https://wiki.ubuntu.com/CoverityCheckerDictionary 寻找MIXED_ENUMS。

答案 5 :(得分:0)

正如其他人已经说过的那样,在C中没有对此的支持。如果你绝对想要进行强类型检查,你可以这样做:

function main() {

    canvas = new fabric.Canvas('imageCanvas');

    // loading image on canvas
    document.getElementById('uploadedImg').onchange = function handleImage(e) {
        var reader = new FileReader();
        reader.onload = function (event) {
            var imgObj = new Image();
            imgObj.src = event.target.result;

            imgObj.onload = function () {

                // start fabricJS stuff
                image = new fabric.Image(imgObj);
                image.set({

                    centeredRotation: true,
                    centeredScaling: true,
                });

                canvas.add(image);
            };

        };
        reader.readAsDataURL(e.target.files[0]);
    };
}

请注意,这可能会对性能产生一些影响。