Vectorcast中的奇怪字符串长度限制(/修剪) - Ada

时间:2016-04-23 22:53:28

标签: unit-testing 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 Source_String'Length <= Natural(Err_Msg_Max_Length) then

被正确评估为True。但奇怪的是,如果传递给函数 Fixed_String_To_Chr_Ptr()的字符串(Source_String)的长度大于100 (Err_Msg_Max_Length),函数仍然 TRUE 将上述条件评估为true,因为字符串的长度大于 Err_Msg_Max_Length ,所以根本不会发生这种情况。在调试时,观察到即使传递给函数 Fixed_String_To_Chr_Ptr()的字符串(Source_String)的长度大于100,内部函数也是限制/修剪它的长度只有100 **(Err_Msg_Max_Length)**。

这里有什么问题吗?

2 个答案:

答案 0 :(得分:1)

对于无约束字符串,Vectorcast的配置限制默认为100大小。增加大小解决了这个问题。 enter image description here

答案 1 :(得分:0)

以上代码等于以下内容:

-- 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&gt;条件不能成立100 ...如果是,那么有一些奇怪的错误 - 可能在编译器中。你确定你的'长度&gt; 100?