PVS-Studio与Chromium

发布时间:2019-09-29 15:32

这次赢了。更确切地说,Chromium项目的源代已经获胜。 Chromium是我们用PVS-Studio检查过的最好的项目之一。

Chromium是一款由Google开发的开源网络浏览器,旨在为用户提供快速安全的互联网访问。 Chromium是Google Chrome浏览器的基础。此外,Chromium是谷歌Chrome的初步版本以及其他一些替代网络浏览器。

从编程的角度来看,Chromium是一个由473个项目组成的解决方案。源C / C ++代的一般大小约为460 MB,行数很难计算。

这些460 MB包括许多不同的库。如果排除它们,则大约有155 MB。它要少得多,但仍然很多。而且,你知道,一切都是相对的。其中许多库是由Chromium开发人员在创建Chromium本身的任务中创建的。虽然这些库本身就存在,但我们仍然可以将它们引用到浏览器中。

Chromium已经成为我在PVS-Studio测试过程中研究过的最优质,最大的项目。在处理Chromium项目时,我们实际上并不清楚究竟是什么:我们在PVS-Studio中发现并修复了与C ++文件分析相关的几个错误以及对特定项目结构的支持。

Chromium中使用的许多方面和方法都显示了其源代的质量。例如,大多数程序员使用以下构造确定数组中的项目数:

int XX [] = {1,2,3,4};
size_t N = sizeof(XX)/ sizeof(XX [0]);

通常它被安排为这种宏:

#define count_of(arg)(sizeof(arg)/ sizeof(arg [0]))

这是一个非常有效且有用的宏。说实话,我自己总是使用这个宏。但是,它可能会导致错误,因为您可能会意外地将一个简单的指针传递给它,它不会介意。让我通过以下示例解释这一点:

void Test(int C [3])
{
int A [3];
int * B = Foo();
size_t x = count_of (一个); // Ok
x = count_of(B); //错误
x = count_of(C); //错误
}

count_of(A)构造正常工作,并返回A数组中的项目数,此处等于三。

但是如果你偶然将count_of()应用于指针,那么结果将是无意义的值。问题是宏不会对程序员产生关于count_of(B)排序的奇怪构造的任何警告。这种情况似乎是牵强附会和人为的,但我在各种应用程序中遇到过它。例如,请考虑Miranda IM项目中的此代:

#define SIZEOF(X)(sizeof(X)/ sizeof(X [0]))
int Cache_GetLineText(...,LPTSTR text,int text_size,...)
{
...
tmi.printDateTime(pdnce-> hTimeZone,_T(“t”),text,SIZEOF(text),0);
...
}

因此,您的代中可能存在此类错误,您最好有一些东西来保护自己免受这些错误的影响。在尝试计算作为参数传递的数组的大小时,更容易犯错:

void Test(int C [3])
{
x = count_of(C); //错误
}根据C ++标准,'C'变量是一个简单的指针,而不是一个数组。因此,您可能经常在程序中看到只处理了传递的数组的一部分。

由于我们已经开始讲这样的错误,让我告诉你一个方法,它将帮助你找到传递的数组的大小。你应该通过引用传递它:

void Test(int(&C)[3])
{
x = count_of(C); //好的
}

现在count_of(C)表达式的结果是值3。

让我们回到Chromium。它使用一个允许您避免上述错误的宏。这就是它的实现方式:

模板
char(&ArraySizeHelper(T(&array)[N]))[N];
#define arraysize(array)(sizeof(ArraySizeHelper(array)))

这个魔法的概念如下:模板函数ArraySizeHelper接收一个N长度随机类型的数组。该函数返回对由'char'项组成的N长度数组的引用。此能没有实现,因为我们不需要它。对于sizeof()运算符,仅仅定义ArraySizeHelper函数就足够了。 'arraysize'宏计算ArraySizeHelper函数返回的字节数组的大小。此大小是数组中要计算其长度的项目数。

如果你因为这一切而疯了,那就接受我的话吧 - 它有效。它的效果比'coun

这次赢了。更确切地说,Chromium项目的源代已经获胜。 Chromium是我们用PVS-Studio检查过的最好的项目之一。

Chromium是一款由Google开发的开源网络浏览器,旨在为用户提供快速安全的互联网访问。 Chromium是Google Chrome浏览器的基础。此外,Chromium是谷歌Chrome的初步版本以及其他一些替代网络浏览器。

从编程的角度来看,Chromium是一个由473个项目组成的解决方案。源C / C ++代的一般大小约为460 MB,行数很难计算。

这些460 MB包括许多不同的库。如果排除它们,则大约有155 MB。它要少得多,但仍然很多。而且,你知道,一切都是相对的。其中许多库是由Chromium开发人员在创建Chromium本身的任务中创建的。虽然这些库本身就存在,但我们仍然可以将它们引用到浏览器中。

Chromium已经成为我在PVS-Studio测试过程中研究过的最优质,最大的项目。在处理Chromium项目时,我们实际上并不清楚究竟是什么:我们在PVS-Studio中发现并修复了与C ++文件分析相关的几个错误以及对特定项目结构的支持。

Chromium中使用的许多方面和方法都显示了其源代的质量。例如,大多数程序员使用以下构造确定数组中的项目数:

int XX [] = {1,2,3,4};
size_t N = sizeof(XX)/ sizeof(XX [0]);

通常它被安排为这种宏:

#define count_of(arg)(sizeof(arg)/ sizeof(arg [0]))

这是一个非常有效且有用的宏。说实话,我自己总是使用这个宏。但是,它可能会导致错误,因为您可能会意外地将一个简单的指针传递给它,它不会介意。让我通过以下示例解释这一点:

void Test(int C [3])
{
int A [3];
int * B = Foo();
size_t x = count_of (一个); // Ok
x = count_of(B); //错误
x = count_of(C); //错误
}

count_of(A)构造正常工作,并返回A数组中的项目数,此处等于三。

但是如果你偶然将count_of()应用于指针,那么结果将是无意义的值。问题是宏不会对程序员产生关于count_of(B)排序的奇怪构造的任何警告。这种情况似乎是牵强附会和人为的,但我在各种应用程序中遇到过它。例如,请考虑Miranda IM项目中的此代:

#define SIZEOF(X)(sizeof(X)/ sizeof(X [0]))
int Cache_GetLineText(...,LPTSTR text,int text_size,...)
{
...
tmi.printDateTime(pdnce-> hTimeZone,_T(“t”),text,SIZEOF(text),0);
...
}

因此,您的代中可能存在此类错误,您最好有一些东西来保护自己免受这些错误的影响。在尝试计算作为参数传递的数组的大小时,更容易犯错:

void Test(int C [3])
{
x = count_of(C); //错误
}根据C ++标准,'C'变量是一个简单的指针,而不是一个数组。因此,您可能经常在程序中看到只处理了传递的数组的一部分。

由于我们已经开始讲这样的错误,让我告诉你一个方法,它将帮助你找到传递的数组的大小。你应该通过引用传递它:

void Test(int(&C)[3])
{
x = count_of(C); //好的
}

现在count_of(C)表达式的结果是值3。

让我们回到Chromium。它使用一个允许您避免上述错误的宏。这就是它的实现方式:

模板
char(&ArraySizeHelper(T(&array)[N]))[N];
#define arraysize(array)(sizeof(ArraySizeHelper(array)))

这个魔法的概念如下:模板函数ArraySizeHelper接收一个N长度随机类型的数组。该函数返回对由'char'项组成的N长度数组的引用。此能没有实现,因为我们不需要它。对于sizeof()运算符,仅仅定义ArraySizeHelper函数就足够了。 'arraysize'宏计算ArraySizeHelper函数返回的字节数组的大小。此大小是数组中要计算其长度的项目数。

如果你因为这一切而疯了,那就接受我的话吧 - 它有效。它的效果比'coun

这次赢了。更确切地说,Chromium项目的源代已经获胜。 Chromium是我们用PVS-Studio检查过的最好的项目之一。

Chromium是一款由Google开发的开源网络浏览器,旨在为用户提供快速安全的互联网访问。 Chromium是Google Chrome浏览器的基础。此外,Chromium是谷歌Chrome的初步版本以及其他一些替代网络浏览器。

从编程的角度来看,Chromium是一个由473个项目组成的解决方案。源C / C ++代的一般大小约为460 MB,行数很难计算。

这些460 MB包括许多不同的库。如果排除它们,则大约有155 MB。它要少得多,但仍然很多。而且,你知道,一切都是相对的。其中许多库是由Chromium开发人员在创建Chromium本身的任务中创建的。虽然这些库本身就存在,但我们仍然可以将它们引用到浏览器中。

Chromium已经成为我在PVS-Studio测试过程中研究过的最优质,最大的项目。在处理Chromium项目时,我们实际上并不清楚究竟是什么:我们在PVS-Studio中发现并修复了与C ++文件分析相关的几个错误以及对特定项目结构的支持。

Chromium中使用的许多方面和方法都显示了其源代的质量。例如,大多数程序员使用以下构造确定数组中的项目数:

int XX [] = {1,2,3,4};
size_t N = sizeof(XX)/ sizeof(XX [0]);

通常它被安排为这种宏:

#define count_of(arg)(sizeof(arg)/ sizeof(arg [0]))

这是一个非常有效且有用的宏。说实话,我自己总是使用这个宏。但是,它可能会导致错误,因为您可能会意外地将一个简单的指针传递给它,它不会介意。让我通过以下示例解释这一点:

void Test(int C [3])
{
int A [3];
int * B = Foo();
size_t x = count_of (一个); // Ok
x = count_of(B); //错误
x = count_of(C); //错误
}

count_of(A)构造正常工作,并返回A数组中的项目数,此处等于三。

但是如果你偶然将count_of()应用于指针,那么结果将是无意义的值。问题是宏不会对程序员产生关于count_of(B)排序的奇怪构造的任何警告。这种情况似乎是牵强附会和人为的,但我在各种应用程序中遇到过它。例如,请考虑Miranda IM项目中的此代:

#define SIZEOF(X)(sizeof(X)/ sizeof(X [0]))
int Cache_GetLineText(...,LPTSTR text,int text_size,...)
{
...
tmi.printDateTime(pdnce-> hTimeZone,_T(“t”),text,SIZEOF(text),0);
...
}

因此,您的代中可能存在此类错误,您最好有一些东西来保护自己免受这些错误的影响。在尝试计算作为参数传递的数组的大小时,更容易犯错:

void Test(int C [3])
{
x = count_of(C); //错误
}根据C ++标准,'C'变量是一个简单的指针,而不是一个数组。因此,您可能经常在程序中看到只处理了传递的数组的一部分。

由于我们已经开始讲这样的错误,让我告诉你一个方法,它将帮助你找到传递的数组的大小。你应该通过引用传递它:

void Test(int(&C)[3])
{
x = count_of(C); //好的
}

现在count_of(C)表达式的结果是值3。

让我们回到Chromium。它使用一个允许您避免上述错误的宏。这就是它的实现方式:

模板
char(&ArraySizeHelper(T(&array)[N]))[N];
#define arraysize(array)(sizeof(ArraySizeHelper(array)))

这个魔法的概念如下:模板函数ArraySizeHelper接收一个N长度随机类型的数组。该函数返回对由'char'项组成的N长度数组的引用。此能没有实现,因为我们不需要它。对于sizeof()运算符,仅仅定义ArraySizeHelper函数就足够了。 'arraysize'宏计算ArraySizeHelper函数返回的字节数组的大小。此大小是数组中要计算其长度的项目数。

如果你因为这一切而疯了,那就接受我的话吧 - 它有效。它的效果比'coun

这次赢了。更确切地说,Chromium项目的源代已经获胜。 Chromium是我们用PVS-Studio检查过的最好的项目之一。

Chromium是一款由Google开发的开源网络浏览器,旨在为用户提供快速安全的互联网访问。 Chromium是Google Chrome浏览器的基础。此外,Chromium是谷歌Chrome的初步版本以及其他一些替代网络浏览器。

从编程的角度来看,Chromium是一个由473个项目组成的解决方案。源C / C ++代的一般大小约为460 MB,行数很难计算。

这些460 MB包括许多不同的库。如果排除它们,则大约有155 MB。它要少得多,但仍然很多。而且,你知道,一切都是相对的。其中许多库是由Chromium开发人员在创建Chromium本身的任务中创建的。虽然这些库本身就存在,但我们仍然可以将它们引用到浏览器中。

Chromium已经成为我在PVS-Studio测试过程中研究过的最优质,最大的项目。在处理Chromium项目时,我们实际上并不清楚究竟是什么:我们在PVS-Studio中发现并修复了与C ++文件分析相关的几个错误以及对特定项目结构的支持。

Chromium中使用的许多方面和方法都显示了其源代的质量。例如,大多数程序员使用以下构造确定数组中的项目数:

int XX [] = {1,2,3,4};
size_t N = sizeof(XX)/ sizeof(XX [0]);

通常它被安排为这种宏:

#define count_of(arg)(sizeof(arg)/ sizeof(arg [0]))

这是一个非常有效且有用的宏。说实话,我自己总是使用这个宏。但是,它可能会导致错误,因为您可能会意外地将一个简单的指针传递给它,它不会介意。让我通过以下示例解释这一点:

void Test(int C [3])
{
int A [3];
int * B = Foo();
size_t x = count_of (一个); // Ok
x = count_of(B); //错误
x = count_of(C); //错误
}

count_of(A)构造正常工作,并返回A数组中的项目数,此处等于三。

但是如果你偶然将count_of()应用于指针,那么结果将是无意义的值。问题是宏不会对程序员产生关于count_of(B)排序的奇怪构造的任何警告。这种情况似乎是牵强附会和人为的,但我在各种应用程序中遇到过它。例如,请考虑Miranda IM项目中的此代:

#define SIZEOF(X)(sizeof(X)/ sizeof(X [0]))
int Cache_GetLineText(...,LPTSTR text,int text_size,...)
{
...
tmi.printDateTime(pdnce-> hTimeZone,_T(“t”),text,SIZEOF(text),0);
...
}

因此,您的代中可能存在此类错误,您最好有一些东西来保护自己免受这些错误的影响。在尝试计算作为参数传递的数组的大小时,更容易犯错:

void Test(int C [3])
{
x = count_of(C); //错误
}根据C ++标准,'C'变量是一个简单的指针,而不是一个数组。因此,您可能经常在程序中看到只处理了传递的数组的一部分。

由于我们已经开始讲这样的错误,让我告诉你一个方法,它将帮助你找到传递的数组的大小。你应该通过引用传递它:

void Test(int(&C)[3])
{
x = count_of(C); //好的
}

现在count_of(C)表达式的结果是值3。

让我们回到Chromium。它使用一个允许您避免上述错误的宏。这就是它的实现方式:

模板
char(&ArraySizeHelper(T(&array)[N]))[N];
#define arraysize(array)(sizeof(ArraySizeHelper(array)))

这个魔法的概念如下:模板函数ArraySizeHelper接收一个N长度随机类型的数组。该函数返回对由'char'项组成的N长度数组的引用。此能没有实现,因为我们不需要它。对于sizeof()运算符,仅仅定义ArraySizeHelper函数就足够了。 'arraysize'宏计算ArraySizeHelper函数返回的字节数组的大小。此大小是数组中要计算其长度的项目数。

如果你因为这一切而疯了,那就接受我的话吧 - 它有效。它的效果比'coun

上一篇:戴尔的新款XPS笔记本电脑拥有酷睿i5处理器,高清网络摄像头和JBL
下一篇:行人,关于标志的游戏,看起来很棒