Vectorcast - Ada 中奇怪的字符串长度限制(/修剪)
Strange string length limiting (/trimming) in Vectorcast - Ada
在以下 Ada 代码中:
package body TestMyApp is
use type Base_Types.Natural16;
use type Base_Types.Integer32;
use type C.Strings.Chars_Ptr;
use type C.Size_T;
-- Error Messages length should be limited by upper bound 'Err_Msg_Max_Len'
Err_Msg_Max_Length : constant C.Size_T := 100;
Glb_C_Err_Msg_String : aliased C.Char_Array := (1..(Err_Msg_Max_Length + 1) => C.nul);
function Fixed_String_To_Chr_Ptr (Source_String : String;
Trim_For_Whitespaces : Boolean) return C.Strings.Chars_Ptr is
Ptr : C.Strings.Chars_Ptr := C.Strings.Null_Ptr;
Elem_Copied_Count : C.Size_T := 0;
begin
-- Reset each character in Glb_C_Err_Msg_String array to nul
Glb_C_Err_Msg_String := (1..(Err_Msg_Max_Length + 1) => C.nul);
-- Check whether source string is of acceptable length
if Source_String'Length <= Natural(Err_Msg_Max_Length) then
if Trim_For_Whitespaces = True then
-- Copy fixed string elements into char_array with
-- source string's both side trimmed for whitespaces
C.To_C(Item => Ada.Strings.Fixed.Trim(Source => Source_String, Side => Ada.Strings.Both),
Target => Glb_C_Err_Msg_String,
Count => Elem_Copied_Count,
Append_Nul => True);
else
-- Copy fixed string elements into char_array
C.To_C(Item => Source_String,
Target => Glb_C_Err_Msg_String,
Count => Elem_Copied_Count,
Append_Nul => True);
end if;
-- Convert char_array into char_ptr
Ptr := C.Strings.To_Chars_Ptr(Item => Glb_C_Err_Msg_String'Access,
Nul_Check => True);
else
Ptr := C.Strings.Null_Ptr;
end if;
-- Return the char_ptr
return Ptr;
end Fixed_String_To_Chr_Ptr;
end TestMyApp;
在VectorCast-Ada中进行单元测试时,如果字符串长度(Source_String) 传递给函数 Fixed_String_To_Chr_Ptr() 小于或等于 100 (Err_Msg_Max_Length), 函数被正确执行并且以下 if 条件:
if Source_String'Length <= Natural(Err_Msg_Max_Length) then
正确评估为 True。然而奇怪的是,如果传递给函数 Fixed_String_To_Chr_Ptr() 的字符串 (Source_String) 的长度是大于 100 (Err_Msg_Max_Length),函数仍然 TRUE 将上述条件评估为真,这根本不应该发生,因为字符串的长度大于Err_Msg_Max_Length。在调试时,观察到即使将字符串 (Source_String) 的长度传递给函数 Fixed_String_To_Chr_Ptr() 大于 100,在内部函数是 limiting/trimming 它的长度只有 100**(Err_Msg_Max_Length)**。
知道这里出了什么问题吗?
以上代码等同于:
-- Check whether source string is of acceptable length
if Source_String'Length <= Natural (Err_Msg_Max_Length) then
Trim ( ); -- to make it easier to see what is actually going on here
else -- personally, I don't see a point in this else statement
Ptr := C.Strings.Null_Ptr;
end if;
因此,如果您的 Source_String 比 Err_Msg_Max_Length 长,则 Ptr 为空(并在返回之后立即返回)。如果你问我有点奇怪 - 我会理解将它修剪到前 100 个字符或类似的东西,但完全删除消息?
PS:Source_String'Length > 100 的条件不成立...如果是,则存在一些奇怪的错误 - 可能在编译器中。您确定您的“长度 > 100 吗?
这是 Vectorcast 对默认大小为 100 的无约束字符串的配置限制。增加尺寸解决了这个问题。
在以下 Ada 代码中:
package body TestMyApp is
use type Base_Types.Natural16;
use type Base_Types.Integer32;
use type C.Strings.Chars_Ptr;
use type C.Size_T;
-- Error Messages length should be limited by upper bound 'Err_Msg_Max_Len'
Err_Msg_Max_Length : constant C.Size_T := 100;
Glb_C_Err_Msg_String : aliased C.Char_Array := (1..(Err_Msg_Max_Length + 1) => C.nul);
function Fixed_String_To_Chr_Ptr (Source_String : String;
Trim_For_Whitespaces : Boolean) return C.Strings.Chars_Ptr is
Ptr : C.Strings.Chars_Ptr := C.Strings.Null_Ptr;
Elem_Copied_Count : C.Size_T := 0;
begin
-- Reset each character in Glb_C_Err_Msg_String array to nul
Glb_C_Err_Msg_String := (1..(Err_Msg_Max_Length + 1) => C.nul);
-- Check whether source string is of acceptable length
if Source_String'Length <= Natural(Err_Msg_Max_Length) then
if Trim_For_Whitespaces = True then
-- Copy fixed string elements into char_array with
-- source string's both side trimmed for whitespaces
C.To_C(Item => Ada.Strings.Fixed.Trim(Source => Source_String, Side => Ada.Strings.Both),
Target => Glb_C_Err_Msg_String,
Count => Elem_Copied_Count,
Append_Nul => True);
else
-- Copy fixed string elements into char_array
C.To_C(Item => Source_String,
Target => Glb_C_Err_Msg_String,
Count => Elem_Copied_Count,
Append_Nul => True);
end if;
-- Convert char_array into char_ptr
Ptr := C.Strings.To_Chars_Ptr(Item => Glb_C_Err_Msg_String'Access,
Nul_Check => True);
else
Ptr := C.Strings.Null_Ptr;
end if;
-- Return the char_ptr
return Ptr;
end Fixed_String_To_Chr_Ptr;
end TestMyApp;
在VectorCast-Ada中进行单元测试时,如果字符串长度(Source_String) 传递给函数 Fixed_String_To_Chr_Ptr() 小于或等于 100 (Err_Msg_Max_Length), 函数被正确执行并且以下 if 条件:
if Source_String'Length <= Natural(Err_Msg_Max_Length) then
正确评估为 True。然而奇怪的是,如果传递给函数 Fixed_String_To_Chr_Ptr() 的字符串 (Source_String) 的长度是大于 100 (Err_Msg_Max_Length),函数仍然 TRUE 将上述条件评估为真,这根本不应该发生,因为字符串的长度大于Err_Msg_Max_Length。在调试时,观察到即使将字符串 (Source_String) 的长度传递给函数 Fixed_String_To_Chr_Ptr() 大于 100,在内部函数是 limiting/trimming 它的长度只有 100**(Err_Msg_Max_Length)**。
知道这里出了什么问题吗?
以上代码等同于:
-- Check whether source string is of acceptable length
if Source_String'Length <= Natural (Err_Msg_Max_Length) then
Trim ( ); -- to make it easier to see what is actually going on here
else -- personally, I don't see a point in this else statement
Ptr := C.Strings.Null_Ptr;
end if;
因此,如果您的 Source_String 比 Err_Msg_Max_Length 长,则 Ptr 为空(并在返回之后立即返回)。如果你问我有点奇怪 - 我会理解将它修剪到前 100 个字符或类似的东西,但完全删除消息?
PS:Source_String'Length > 100 的条件不成立...如果是,则存在一些奇怪的错误 - 可能在编译器中。您确定您的“长度 > 100 吗?
这是 Vectorcast 对默认大小为 100 的无约束字符串的配置限制。增加尺寸解决了这个问题。