小编Aka*_*kay的帖子

Ada中的变异函数(C - Ada绑定)?

我正在开发一个使用C - Ada语言绑定的项目.C中的函数将调用Ada端的函数.我想在Ada中创建一个可变函数,它可以接收从C函数发送的可变数量的参数.我还想同时发送不同类型的args,如int,char,enums等.是否有可能拥有这种机制?

c ada variadic-functions variadic-templates

6
推荐指数
2
解决办法
442
查看次数

安全关键项目中动态分配的替代方案(C)

安全关键项目不建议任何动态分配或释放分配的内存.仅在程序执行的精化/初始化阶段,才允许.

我知道你们中的大多数人都会争论实施SW,它应该只进行所有静态分配,或者在代码中做一些理由,动态分配不会损害整个程序等等,但是,这个问题还有其他选择吗?有什么方法或任何例子可以在程序初始化/详细说明期间分配一些(堆)内存并从那里分配/释放内存?如果我们真的想在(安全关键)项目中进行动态分配,还是解决这个问题的任何解决方案/替代方案?

safety-critical dynamic-allocation memory-safety

5
推荐指数
1
解决办法
707
查看次数

在动态分配的数组中存储数据(字符串)超出范围

以下是一个非常简单的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个字符?

c string

5
推荐指数
1
解决办法
106
查看次数

指定超时后有意接收完成 UART DMA 中断

我已将 UART 配置为以 DMA 模式接收,其中缓冲区的大小约为 64 字节。因此,基本上,HAL_UART_RxCpltCallback() DMA 接收完成中断仅在接收到 64 个字符时才会触发。

STM32中有没有一种方法可以为DMA Rx配置超时,当缓冲区仅部分填充(即接收到的字符少于64个)并且我们在指定的超时时间内不再接收到任何字符时,DMA将然后引发相同的基于 HAL_UART_RxCpltCallback() 的中断,让消费者使用 UART 当前接收到的任何部分数据?

stm32 dma stm32f4 stm32f7

5
推荐指数
1
解决办法
3446
查看次数

放置常数的最佳位置

  1. 在多源文件C应用程序中,这是放置常量值的最佳位置,源文件本身还是在其头文件中?前提是该常量仅在该源文件中使用.

  2. 这是保存static const头文件的好方法吗?

c

4
推荐指数
1
解决办法
186
查看次数

使用free()释放C函数中的字符串(在Ada中分配)

我正在开发一个C-Ada绑定应用程序,我在Ada端使用分配一个新字符串Interfaces.C.Strings.New_String().

Interfaces.C.Strings已经有一个过程Free()来为字符串释放内存.因为我需要使用Interfaces.C.Strings.Chars_Ptr以下命令将此字符串传递给C函数:

  1. 如果我使用free()函数(在stdlib.h中声明)为C端的字符串释放内存,这样可以吗?

  2. 如果我从C端释放内存,这样安全吗?

  3. 或者我应该使用Interfaces.C.Strings.Free()Ada方面的功能更好地释放它?

c string ada

3
推荐指数
1
解决办法
257
查看次数

双方都有副作用吗?

我使用以下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)

并从PC-lint报告中得到以下结论: 在此输入图像描述

有人可以解释第58和66行的代码如何遭受副作用,我该如何纠正?

c lint side-effects misra pc-lint

3
推荐指数
1
解决办法
1032
查看次数

释放驻留在可执行文件中的字符串的内存

当我们将字符串声明为:

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()接口只在堆上工作?

c

1
推荐指数
1
解决办法
52
查看次数

函数范围结束后内存中局部变量的持久性?

例如,如果我有一个小功能:

int sum(int a, int b)
{
   int result = a+b;
   return result;
}
Run Code Online (Sandbox Code Playgroud)

这里result是一个局部变量,根据我的理解,它应该只存在于函数的执行时间.该函数的调用者如何能够检索sum()函数的返回值,该函数只是局部变量的值result?只是想知道函数内声明的局部变量的值是如何返回给调用函数的.我知道这发生在堆栈中,但我想知道它是如何发生的.

c

1
推荐指数
1
解决办法
568
查看次数

将结构从C传递到Ada

我需要在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时,我想知道:

  1. 如果我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)

c ada

1
推荐指数
1
解决办法
1013
查看次数