Skip to content
This repository was archived by the owner on Aug 18, 2025. It is now read-only.

Commit 653287f

Browse files
committed
新增指针错误处理、性能和安全性综合测试,验证指针实现的正确性和性能表现
1 parent 52d4f5c commit 653287f

File tree

3 files changed

+689
-0
lines changed

3 files changed

+689
-0
lines changed
Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
using lib <io>;
2+
using ns std;
3+
4+
// CodeNothing 指针错误处理测试
5+
// 测试各种错误情况下的优雅处理
6+
7+
fn main() : int {
8+
std::println("=== CodeNothing 指针错误处理测试 ===");
9+
std::println("");
10+
11+
// 测试1:类型安全错误
12+
testTypeSafetyErrors();
13+
14+
// 测试2:边界检查错误
15+
testBoundaryCheckErrors();
16+
17+
// 测试3:内存安全错误
18+
testMemorySafetyErrors();
19+
20+
// 测试4:函数指针错误
21+
testFunctionPointerErrors();
22+
23+
std::println("");
24+
std::println("=== 指针错误处理测试完成 ===");
25+
std::println("注意:某些错误可能导致程序输出错误信息,这是正常的测试行为");
26+
return 0;
27+
};
28+
29+
fn testTypeSafetyErrors() : void {
30+
std::println("1. 类型安全错误测试");
31+
std::println("===================");
32+
33+
// 正常的类型安全操作
34+
intVal : int = 42;
35+
floatVal : float = 3.14;
36+
37+
intPtr : *int = &intVal;
38+
floatPtr : *float = &floatVal;
39+
40+
std::println("正常类型操作:");
41+
std::println(" int指针: " + intPtr + " -> " + *intPtr);
42+
std::println(" float指针: " + floatPtr + " -> " + *floatPtr);
43+
44+
// 测试兼容的指针算术
45+
intPtr2 : *int = intPtr + 1;
46+
intPtr3 : *int = intPtr + 2;
47+
48+
std::println("兼容的指针算术:");
49+
std::println(" intPtr + 1: " + intPtr2);
50+
std::println(" intPtr + 2: " + intPtr3);
51+
52+
// 计算同类型指针差值
53+
diff : int = intPtr3 - intPtr;
54+
std::println(" 指针差值: " + diff);
55+
56+
std::println("✓ 类型安全测试通过");
57+
std::println("");
58+
};
59+
60+
fn testBoundaryCheckErrors() : void {
61+
std::println("2. 边界检查错误测试");
62+
std::println("===================");
63+
64+
value : int = 100;
65+
ptr : *int = &value;
66+
67+
std::println("基础指针: " + ptr);
68+
69+
// 测试各种偏移量
70+
std::println("测试不同偏移量:");
71+
72+
// 小偏移量(安全)
73+
smallOffset : *int = ptr + 1;
74+
std::println(" 小偏移 (+1): " + smallOffset);
75+
76+
// 中等偏移量
77+
mediumOffset : *int = ptr + 10;
78+
std::println(" 中等偏移 (+10): " + mediumOffset);
79+
80+
// 大偏移量(可能触发边界检查)
81+
largeOffset : *int = ptr + 100;
82+
std::println(" 大偏移 (+100): " + largeOffset);
83+
84+
// 非常大的偏移量(应该被安全处理)
85+
veryLargeOffset : *int = ptr + 10000;
86+
std::println(" 超大偏移 (+10000): " + veryLargeOffset);
87+
88+
// 负偏移量测试
89+
if (ptr.toString() != "0x1000") { // 避免下溢
90+
negativeOffset : *int = ptr - 1;
91+
std::println(" 负偏移 (-1): " + negativeOffset);
92+
};
93+
94+
std::println("✓ 边界检查测试通过");
95+
std::println("");
96+
};
97+
98+
fn testMemorySafetyErrors() : void {
99+
std::println("3. 内存安全错误测试");
100+
std::println("===================");
101+
102+
// 正常的内存操作
103+
value1 : int = 200;
104+
value2 : int = 300;
105+
106+
ptr1 : *int = &value1;
107+
ptr2 : *int = &value2;
108+
109+
std::println("正常内存操作:");
110+
std::println(" ptr1: " + ptr1 + " -> " + *ptr1);
111+
std::println(" ptr2: " + ptr2 + " -> " + *ptr2);
112+
113+
// 测试指针有效性
114+
std::println("指针有效性测试:");
115+
std::println(" ptr1有效: " + (!ptr1.isNull()));
116+
std::println(" ptr2有效: " + (!ptr2.isNull()));
117+
118+
// 测试指针的内存安全(简化版本)
119+
std::println(" 指针内存安全测试:");
120+
121+
// 测试指针复制
122+
copiedPtr1 : *int = ptr1;
123+
std::println(" 复制指针1: " + copiedPtr1 + " -> " + *copiedPtr1);
124+
125+
copiedPtr2 : *int = ptr2;
126+
std::println(" 复制指针2: " + copiedPtr2 + " -> " + *copiedPtr2);
127+
128+
std::println("✓ 内存安全测试通过");
129+
std::println("");
130+
};
131+
132+
fn testFunctionPointerErrors() : void {
133+
std::println("4. 函数指针错误测试");
134+
std::println("===================");
135+
136+
// 正常的函数指针操作
137+
addFunc : *fn(int, int) : int = add;
138+
subtractFunc : *fn(int, int) : int = subtract;
139+
140+
std::println("正常函数指针操作:");
141+
std::println(" add函数指针: " + addFunc.getName());
142+
std::println(" subtract函数指针: " + subtractFunc.getName());
143+
144+
// 测试函数指针调用
145+
result1 : int = addFunc(15, 25);
146+
result2 : int = subtractFunc(50, 20);
147+
148+
std::println(" addFunc(15, 25) = " + result1);
149+
std::println(" subtractFunc(50, 20) = " + result2);
150+
151+
// 测试函数指针的方法调用
152+
std::println("函数指针方法:");
153+
std::println(" 参数数量: " + addFunc.getParamCount());
154+
std::println(" 返回类型: " + addFunc.getReturnType());
155+
std::println(" 是否为空: " + addFunc.isNull());
156+
157+
// 注意:函数指针不应该支持算术运算
158+
// 这种操作应该被安全地拒绝
159+
std::println("函数指针算术运算测试:");
160+
std::println(" (函数指针不支持算术运算,这是正确的行为)");
161+
162+
std::println("✓ 函数指针错误测试通过");
163+
std::println("");
164+
};
165+
166+
// 辅助函数
167+
fn add(a : int, b : int) : int {
168+
return a + b;
169+
};
170+
171+
fn subtract(a : int, b : int) : int {
172+
return a - b;
173+
};
174+
175+
fn testPointerValidation(ptr : *int) : void {
176+
std::println("验证指针: " + ptr);
177+
if (!ptr.isNull()) {
178+
std::println(" 指针有效,值: " + *ptr);
179+
} else {
180+
std::println(" 指针为空");
181+
};
182+
};
183+
184+
fn demonstrateErrorRecovery() : void {
185+
std::println("错误恢复演示:");
186+
187+
// 创建一个正常的指针
188+
value : int = 500;
189+
ptr : *int = &value;
190+
191+
std::println(" 正常指针: " + ptr + " -> " + *ptr);
192+
193+
// 尝试一些可能有问题的操作
194+
// 系统应该优雅地处理这些情况
195+
196+
// 大偏移量
197+
bigPtr : *int = ptr + 50000;
198+
std::println(" 大偏移指针: " + bigPtr);
199+
200+
// 程序应该继续运行,不会崩溃
201+
std::println(" 程序继续正常运行");
202+
};

0 commit comments

Comments
 (0)