我正在尝试使用Frama-C来验证包含动态内存分配的C代码的安全属性.当前版本的ACSL规范语言(1.8)似乎能够表达很多关于动态分配的内存.但是,大部分内容尚未在Frama-C Neon中实现.
假设我们采用以下代码片段:
#include <stdlib.h>
/*@ requires \valid(p) && \valid(q) && \separated(p, q);
@ ensures \valid(q);
@*/
void test(char *p, char *q) {
free(p);
}
int main(void) {
char *p = (char *) malloc(10);
char *q = (char *) malloc(10);
test(p, q);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
因此,main分配两块内存,并将指针传递给它们进行功能测试.测试释放p指向的块,但不释放q指向的块.假设我想证明在测试结束时,指针q仍然有效.我该怎么办?
似乎我必须自己建模堆:axiomatize一些谓词谈论堆,并使用它们来指定malloc和free,模仿ACSL的未实现部分.最简单的方法是什么,以便我可以验证上面的例子?
我是C++的新手,想问下面的代码是否是悬空指针或内存泄漏的一个例子,因为它指向动态分配的数组:
int * n = new int[10];
for (int prev = 0; prev < 10; prev++) {
*n = *(n + prev + 1);
}
delete[] n;
n = nullptr;
Run Code Online (Sandbox Code Playgroud) 安全关键项目不建议任何动态分配或释放分配的内存.仅在程序执行的精化/初始化阶段,才允许.
我知道你们中的大多数人都会争论实施SW,它应该只进行所有静态分配,或者在代码中做一些理由,动态分配不会损害整个程序等等,但是,这个问题还有其他选择吗?有什么方法或任何例子可以在程序初始化/详细说明期间分配一些(堆)内存并从那里分配/释放内存?如果我们真的想在(安全关键)项目中进行动态分配,还是解决这个问题的任何解决方案/替代方案?
在 Spark 2.2.0 上执行我的 scala 作业时,我不时遇到以下错误:
引起:java.io.FileNotFoundException:/spark/temporary/spark-927d72b5-154d-4fd5-a18e-4aefc0e05a59/executor-cdd8da76-bb86-4e4c-bf26-55acbcc761bf15cbc761bf/spark-927fd5-a18e-4aefc0e05a59 0f/shuffle_1_0_0.index(没有那个文件或目录)
我的 spark-submit 命令如下所示:
/spark/bin/spark-submit --verbose --conf spark.local.dir=/spark/temporary --conf spark.dynamicAllocation.enabled=true --conf spark.shuffle.service.enabled=true --conf spark.dynamicAllocation.executorIdleTimeout=2m --conf spark.shuffle.service.index.cache.entries=4096 --conf spark.memory.offHeap.enabled=true --conf spark.memory.offHeap.size=3g --conf spark.executor.extraJavaOptions="-XX:ParallelGCThreads=4 -XX:+UseParallelGC" --conf spark.file.transferTo=false --conf spark.shuffle.file.buffer=5MB --conf spark.shuffle.unsafe.file.output.buffer=5MB --conf spark.unsafe.sorter.spill.reader.buffer.size=1MB --conf spark.io.compression.lz4.blockSize=512KB --conf spark.shuffle.registration.timeout=2m --conf spark.shuffle.registration.maxAttempts=5 --conf spark.memory.useLegacyMode=true --conf spark.shuffle.memoryFraction=0.32 --conf spark.storage.memoryFraction=0.18 --conf spark.shuffle.io.maxRetries=10 --conf spark.dynamicAllocation.maxExecutors=3 --conf spark.dynamicAllocation.initialExecutors=3 --conf spark.task.cpus=2 --conf spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version=2 --master spark://spark-master.spark:7077 --deploy-mode client --class control.TimeLensDriver --executor-cores 2 --executor-memory 2g --driver-memory 2g /spark/spark-job.jar /spark/s3Credential.conf 2017-09-08 7 /spark/public-holydays.json /spark/school-holydays.json /spark/de_postal_codes.json prometheus-pushgateway.monitoring-mida:9091 …Run Code Online (Sandbox Code Playgroud) 我注意到std::aligned_alloc()进入C ++ 17,我喜欢它。但是-当我需要重新分配时会发生什么?我可以手动执行此操作(假设当前分配的地址处的可用空间仅是我要求的空间量),但是标准库中是否不应该提供此功能?
c++ memory-alignment dynamic-allocation c++17 memory-reallocation
我试图在一个非常简单的C++程序中动态分配(它现在不是那么动态,但最终会是)对象的内存.我是班级新手,最近才开始玩C++,让C落后.这是代码:
#include <iostream>
using namespace std;
class Test {
private:
int i;
public:
Test(int);
~Test();
void print();
};
Test::Test(int ii) { i = ii; }
Test::~Test() { i=0; cout << "deconstructor called...value of i= " << i << endl; }
void Test::print() { cout << "value of i= " << i << endl; }
int main()
{
Test a(10),*b,*c;
//a.print(); // this works
b = new Test(12);
//b->print(); // this works as well
for (int i=0; i<2; i++) …Run Code Online (Sandbox Code Playgroud) 我学习用C动态内存分配++和关键字new和new[]被提及.据说,用户可以在运行时指定内存分配的大小,而不像在源代码中声明一个具有固定大小的变量或数组.
我不明白这个概念.它是如何工作的?我只需要澄清这个想法,一个例子会有所帮助!
c++ malloc memory-management new-operator dynamic-allocation
我在 Ada95 中有一个程序,我必须在其中创建一个字符串数组。该数组可以包含可变长度的字符串。
示例:我已经声明了一个数组,其中所有索引都可以存储大小为 50 的字符串。当我为上述数组分配一个较小的字符串时,我得到“约束错误”。
代码:
procedure anyname is
input_array : array(1..5) of String(1..50);
begin
input_array(1):="12345";
end anyname;
Run Code Online (Sandbox Code Playgroud)
我试图创建 Unbounded_Strings 数组。但这也行不通。谁能告诉我如何在上面的字符串数组中存储这个“12345”?
假设我们有:
int** myArray = new int*[100];
for(int i = 0; i < 100; i++){
myArray[i] = new int[3];
}
Run Code Online (Sandbox Code Playgroud)
解除分配此数组的适当方法是什么(下面的方法,如果这是正确的方法)?
1.
delete[] myArray;
Run Code Online (Sandbox Code Playgroud)
2.
for(int i = 0; i < 100; i++){
for(int j = 0; j < 3; j++){
delete myArray[i][j];
}
}
delete[] myArray;
Run Code Online (Sandbox Code Playgroud)
直观地看起来我们应该做类似2.因为我们想要删除所有分配的内存,但我不确定.
假设a class X具有构造函数X(int a, int b)
我创建了一个指向X的指针,X *ptr;为类动态分配内存.
现在创建一个X类对象数组
ptr = new X[sizeOfArray];
Run Code Online (Sandbox Code Playgroud)
到现在一切都很好.但我想要做的是创建上面的对象数组应该调用构造函数X(int a, int b).我尝试如下:
ptr = new X(1,2)[sizeOfArray];
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,它给了我编译时错误
错误:预期';' 在'['标记|之前
如何创建一个对象数组来调用构造函数?
SizeOfArray 用户在运行时输入.
编辑:
我想要达到的目标是不可能的,如天顶所回答的那样,或者太复杂了.那我std::vector该如何使用呢?
c++ ×5
arrays ×2
malloc ×2
ada ×1
apache-spark ×1
c++11 ×1
c++17 ×1
ceph ×1
frama-c ×1
memory-leaks ×1
new-operator ×1
pointers ×1
scala ×1
shuffle ×1
string ×1