2016-04-23 8 views
0

Im folgenden Ada-Code:merkwürdige Stringlänge Begrenzung (/ Trimmen) in Vector - 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; 

Während Komponententests in Vector-Ada, wenn die Länge der Zeichenfolge (Source_String) wobei auf die Funktion Fixed_String_To_Chr_Ptr() übergeben kleiner oder gleich 100 (Err_Msg_Max_Length) bekam die Funktion richtig ausgeführt wird und die folgende, wenn die Bedingung:

if Source_String'Length <= Natural(Err_Msg_Max_Length) then 

wurde richtig zu True ausgewertet. Aber seltsam, wenn die wenn die Länge der Zeichenfolge (Source_String) an der Funktion Fixed_String_To_Chr_Ptr übergeben wird() größer als 100 (Err_Msg_Max_Length), die Funktion noch TRUE ausgewertet, um die oben genannte Bedingung true die sollte überhaupt nicht passieren, da die Länge der Zeichenfolge größer ist als Err_Msg_Max_Length. Beim Debugging wurde beobachtet, dass die Länge der Zeichenfolge (Source_String), die an die Funktion Fixed_String_To_Chr_Ptr() übergeben wurde, größer als 100 war. Die Funktion beschränkte/kürzte ihre Länge intern auf 100 ** (Err_Msg_Max_Length) * * nur.

Irgendwelche Ideen, was hier falsch ist?

+0

Was ist Vektorübertragung? – darkestkhan

+0

https://www.vectorcast.com/software-testing-products/ada-unit-testing –

+0

Meine Vermutung ist, dass Sie nicht genau die hier gezeigte Funktion testen. –

Antwort

1

Es war Vectorcasts Konfigurationsbeschränkung für unbeschränkte Zeichenfolgen, die auf Größe 100 voreingestellt waren. Durch Erhöhen der Größe wurde das Problem behoben. enter image description here

0

Above-Code ist gleich folgenden:

-- 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; 

Also, wenn Ihr Source_String länger als Err_Msg_Max_Length Ptr auf Null gesetzt wird (und gleich danach wieder). Irgendwie merkwürdig, wenn du mich fragst - ich würde es verstehen, es auf die ersten 100 Zeichen oder so zu schneiden, aber die Nachricht komplett fallen zu lassen?

PS: Die Bedingung kann für Source_String'Length> 100 nicht wahr sein ... wenn es dann ist, gibt es einen seltsamen Fehler - vielleicht im Compiler. Sind Sie sicher, dass Ihre 'Länge> 100?

+0

Ja, ich sende eine Zeichenfolge> 100 in der Länge. –