沃尔特·布赖特(Walter Bright)是D编程语言的“仁慈终身独裁者”,也是Digital Mars的创始人。他在开发多种语言的编译器和解释器方面拥有数十年的经验,其中包括第一个本机C ++编译器Zortech C ++。他还是《帝国》的创建者,《帝国》是西德·迈耶《文明》的主要灵感来源。
您是否对容易制造且难以发现的错误感到厌倦,这些错误在测试期间通常不会浮出水面,并在代码投入生产后销毁精心构建的城堡?一遍又一遍,它们花费了您大量的时间和金钱。啊,如果只有你是一个更好的程序员,那将不会发生,对吗?
也许不是你?我将向您展示这些错误不是您的错:它们是工具的错,并且,如果仅改进工具,则锁将是安全的。
而且您甚至不必做出任何妥协。
超出数组范围
让我们以一个通用程序来计算数组值的总和:
#include <stdio.h>
#define MAX 10
int sumArray(int* p) {
int sum = 0;
int i;
for (i = 0; i <= MAX; ++i)
sum += p[i];
return sum;
}
int main() {
static int values[MAX] = { 7,10,58,62,93,100,8,17,77,17 };
printf("sum = %d\n", sumArray(values));
return 0;
}
该程序应打印:
sum = 449
这正是它的作用-在我的Ubuntu Linux机器上:gcc,clang甚至带有flag -Wall
。我确定您已经猜到错误是什么:
for (i = 0; i <= MAX; ++i)
^^
for (i = 0; i < MAX; ++i)
, , :
- - , ;
- -
<=
.
, ! ? . , . , sumArray
. :
- ,
sumArray
, , . - , .
- ,
MAX
.
, . sumArray
, , , , , .
— , ? - , ? ? , . .
, , , . . . ( , gcc, clang , , - , ).
, — D -betterC
. D , . , :
struct DynamicArray {
T* ptr;
size_t length;
}
:
int[] a;
:
import core.stdc.stdio;
extern (C): // use C ABI for declarations
enum MAX = 10;
int sumArray(int[] a) {
int sum = 0;
for (int i = 0; i <= MAX; ++i)
sum += a[i];
return sum;
}
int main() {
__gshared int[MAX] values = [ 7,10,58,62,93,100,8,17,77,17 ];
printf("sum = %d\n", sumArray(values));
return 0;
}
:
dmd -betterC sum.d
:
./sum
Assertion failure: 'array overflow' on line 11 in file 'sum.d'
- . <=
<
:
./sum
sum = 449
? a
, .
, .
MAX
. a
, :
for (int i = 0; i < a.length; ++i)
, D :
foreach (value; a)
sum += value;
sumArray
:
int sumArray(int[] a) {
int sum = 0;
foreach (value; a)
sum += value;
return sum;
}
sumArray
. , . , .
— ! — . — a
sumArray
, p
. , , .
— , MAX
, , :
int sumArray(int *p, size_t length);
, . D , .
int sumArray(ref int[MAX] a) {
int sum = 0;
foreach (value; a)
sum += value;
return sum;
}
? a
, ref
, . MAX
, . , sumArray
, , .
— ! — . — D . , ? ? , !
, :
import core.stdc.stdio;
extern (C): // use C ABI for declarations
enum MAX = 10;
int sumArray(int* p) {
int sum = 0;
for (int i = 0; i <= MAX; ++i)
sum += p[i];
return sum;
}
int main() {
__gshared int[MAX] values = [ 7,10,58,62,93,100,8,17,77,17 ];
printf("sum = %d\n", sumArray(&values[0]));
return 0;
}
, . , :
sum = 39479
, 449, .
, ? @safe
:
import core.stdc.stdio;
extern (C): // use C ABI for declarations
enum MAX = 10;
@safe int sumArray(int* p) {
int sum = 0;
for (int i = 0; i <= MAX; ++i)
sum += p[i];
return sum;
}
int main() {
__gshared int[MAX] values = [ 7,10,58,62,93,100,8,17,77,17 ];
printf("sum = %d\n", sumArray(&values[0]));
return 0;
}
:
sum.d(10): Error: safe function 'sum.sumArray' cannot index pointer 'p'
, - grep, , @safe
, .
, , , , . , . . , ! ( ).