我正在开发一个使用C - Ada语言绑定的项目.C中的函数将调用Ada端的函数.我想在Ada中创建一个可变函数,它可以接收从C函数发送的可变数量的参数.我还想同时发送不同类型的args,如int,char,enums等.是否有可能拥有这种机制?
安全关键项目不建议任何动态分配或释放分配的内存.仅在程序执行的精化/初始化阶段,才允许.
我知道你们中的大多数人都会争论实施SW,它应该只进行所有静态分配,或者在代码中做一些理由,动态分配不会损害整个程序等等,但是,这个问题还有其他选择吗?有什么方法或任何例子可以在程序初始化/详细说明期间分配一些(堆)内存并从那里分配/释放内存?如果我们真的想在(安全关键)项目中进行动态分配,还是解决这个问题的任何解决方案/替代方案?
以下是一个非常简单的C程序:
char *p = (char*)calloc(5,sizeof(char));
strcpy(p,"Elephant");
printf("String = %s\n", p);
p[6] = 'D';
printf("String = %s\n", p);
Run Code Online (Sandbox Code Playgroud)
它使用calloc()分配一个包含5个元素的char数组,并使用strcpy()将字符串复制到数组中.以下是输出:
String = Elephant
String = ElephaDt
Run Code Online (Sandbox Code Playgroud)
很明显,我只要求5个char元素,因此很想知道为什么OS内存mgmt允许我在p中动态分配空间的边界内存储更多元素.如果我只分配了5个字符的空格,strcpy()是如何存储一个更大的字符串"Elephant",长度大于5个字符?
我已将 UART 配置为以 DMA 模式接收,其中缓冲区的大小约为 64 字节。因此,基本上,HAL_UART_RxCpltCallback() DMA 接收完成中断仅在接收到 64 个字符时才会触发。
STM32中有没有一种方法可以为DMA Rx配置超时,当缓冲区仅部分填充(即接收到的字符少于64个)并且我们在指定的超时时间内不再接收到任何字符时,DMA将然后引发相同的基于 HAL_UART_RxCpltCallback() 的中断,让消费者使用 UART 当前接收到的任何部分数据?
在多源文件C应用程序中,这是放置常量值的最佳位置,源文件本身还是在其头文件中?前提是该常量仅在该源文件中使用.
这是保存static const头文件的好方法吗?
我正在开发一个C-Ada绑定应用程序,我在Ada端使用分配一个新字符串Interfaces.C.Strings.New_String().
Interfaces.C.Strings已经有一个过程Free()来为字符串释放内存.因为我需要使用Interfaces.C.Strings.Chars_Ptr以下命令将此字符串传递给C函数:
如果我使用free()函数(在stdlib.h中声明)为C端的字符串释放内存,这样可以吗?
如果我从C端释放内存,这样安全吗?
或者我应该使用Interfaces.C.Strings.Free()Ada方面的功能更好地释放它?
我使用以下C代码对MISRA 2004和MISRA 2012运行静态代码分析:
BOOL_TYPE Strings_Are_Equal(const char *s1, const char *s2)
{
BOOL_TYPE result = True;
const char *str1 = s1;
const char *str2 = s2;
if (NULL == s1 || NULL == s2)
{
result = False;
}
else if (strlen(s1) != strlen(s2))
{
result = False;
}
else
{
while (*str1 != 0)
{
if(tolower(*str1++) != tolower(*str2++))
{
result = False;
break;
}
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释第58和66行的代码如何遭受副作用,我该如何纠正?
当我们将字符串声明为:
char *x = "Hello";
Run Code Online (Sandbox Code Playgroud)
我所知道的是,这个字符串定义在可执行文件中,因此是只读的.当我尝试释放此字符串的内存时,为什么编译器不会抛出任何错误或运行时没有崩溃:
char *x = "Hello";
printf("String = %s\n", x);
free(x);
printf("String = %s\n", x);
Run Code Online (Sandbox Code Playgroud)
即使执行了free()语句,我也会打印出字符串.是不是像free()接口只在堆上工作?
例如,如果我有一个小功能:
int sum(int a, int b)
{
int result = a+b;
return result;
}
Run Code Online (Sandbox Code Playgroud)
这里result是一个局部变量,根据我的理解,它应该只存在于函数的执行时间.该函数的调用者如何能够检索sum()函数的返回值,该函数只是局部变量的值result?只是想知道函数内声明的局部变量的值是如何返回给调用函数的.我知道这发生在堆栈中,但我想知道它是如何发生的.
我需要在Ada绑定应用程序中将结构从C传递给Ada.因此,我已经在Ada和C中声明了结构,因此两个源侧都可以破译结构组成.
在C中,
typedef struct {
int Status_Code;
int Error_Code;
} Edit_Result_Type;
Run Code Online (Sandbox Code Playgroud)
在阿达,
type Edit_Result_Rec_Type is
record
Status : Integer;
Error_Code : Integer;
end record;
pragma Convention (Convention => C,
Entity => Edit_Result_Rec_Type);
for Edit_Result_Rec_Type use
record
Status at 0 range 0 .. 31;
Error_Code at 0 range 32 .. 63;
end record;
type Edit_Result_Rec_Type_Ptr is access all Edit_Result_Rec_Type;
Run Code Online (Sandbox Code Playgroud)
当我通过参考呼叫将结构从C传递到Ada时,我想知道:
如果我Edit_Result_Rec_Type_Ptr在Ada中为结构声明"全部访问"矢量类型(如上所述 - )并将其直接用作Ada函数中的形式参数,这样可以吗?对于Eg:
procedure Process_Data (Edit_Result_Ptr : in out Edit_Result_Rec_Type_Ptr) is
begin
Edit_Result_Ptr.Status := 1;
Edit_Result_Ptr.Error_Code := 0;
end …Run Code Online (Sandbox Code Playgroud)