C ภาษา (ร่าง) ข้อเสนอที่เปิดใช้งานฟังก์ชั่นทั่วไปและประเภทพารามิเตอร์ใน C; ต้นแบบมีอยู่ที่นี่
Psyche-C เป็นส่วนหนึ่งของคอมไพเลอร์สำหรับภาษา C ได้รับการออกแบบให้เป็นห้องสมุดโดยมุ่งเน้นไปที่การใช้เครื่องมือวิเคราะห์แบบคงที่ของโปรแกรม C โดยไม่ต้องมีความเข้าใจในการตั้งค่าการสร้าง Bellow เป็นลักษณะหลักของ Psyche-C:
struct ที่หายไป, union , enum และ typedef (เนื่องจาก #include ความล้มเหลว)API ดั้งเดิมของ Psyche-C อยู่ใน C ++ แต่ API สำหรับภาษาอื่น ๆ มีการวางแผน
void analyse ( const SourceText& srcText, const FileInfo& fi)
{
ParseOptions parseOpts;
parseOpts. setAmbiguityMode (AmbiguityMode::DisambiguateAlgorithmically);
auto tree = SyntaxTree::parseText (srcText,
TextPreprocessingState::Preprocessed,
TextCompleteness::Fragment,
parseOpts,
fi. fileName ());
auto compilation = Compilation::create ( " code-analysis " );
compilation-> addSyntaxTree (tree. get ());
AnalysisVisitor analysis (tree. get (), compilation-> semanticModel (tree. get ()));
analysis. run (tree-> translationUnitRoot ());
}SyntaxVisitor::Action AnalysisVisitor::visitFunctionDefinition ( const FunctionDefinitionSyntax* node) override
{
const sym = semaModel-> declaredSymbol (node);
if (sym-> kind () == SymbolKind::Function) {
const FunctionSymbol* funSym = sym-> asFunction ();
// ...
}
return Action::Skip;
}
Psyche-C มาพร้อมกับไดรเวอร์ cnippet และสามารถใช้เป็นตัวแยกวิเคราะห์ธรรมดาสำหรับตัวอย่าง C ตัวอย่างเช่นหากคุณรวบรวมตัวอย่างด้านล่างด้วย cnippet คุณจะเห็นการวินิจฉัยคล้ายกับที่คุณเห็นด้วย GCC หรือ Clang
void f ()
{
int ;
} ~ cnip test.c
test.c:4:4 error: declaration does not declare anything
int ;
^
Psyche-C สามารถเลือกได้ (จนถึงตอนนี้มีเฉพาะในสาขาดั้งเดิม) อนุมานประเภทที่ขาดหายไปของตัวอย่าง C ตัวอย่างเช่นสำหรับตัวอย่างด้านล่าง Psyche-C สามารถอนุมานการประกาศ (รวบรวมได้) สำหรับ T สังเคราะห์ในระหว่างการรวบรวม
void f ()
{
T v = 0 ;
v -> value = 42 ;
v -> next = v ;
} typedef struct TYPE_2__ TYPE_1__ ;
struct TYPE_2__
{
int value ;
struct TYPE_2__ * next ;
} ;
typedef TYPE_1__ * T ;คุณอาจต้องการใช้ฟังก์ชั่นนี้เพื่อ:
ยกเว้นการอนุมานประเภทซึ่งเขียนใน Haskell, Psyche-C เขียนใน C ++ 17; Cnippet เขียนใน Python 3
เพื่อสร้าง:
cmake CMakeLists.txt && make -j 4
เพื่อเรียกใช้การทดสอบ:
./test-suite
ของ Psyche-C เอง:
พิมพ์การอนุมานสำหรับ C: แอปพลิเคชันในการวิเคราะห์แบบคงที่ของโปรแกรมที่ไม่สมบูรณ์
การทำธุรกรรม ACM เกี่ยวกับภาษาและระบบการเขียนโปรแกรม - Toplas , เล่มที่ 42, ฉบับที่ 3, บทความหมายเลข 15, ธ.ค. 2020
การอนุมานความหมายแบบคงที่สำหรับโปรแกรม C ที่ไม่สมบูรณ์
การดำเนินการของ ACM เกี่ยวกับภาษาการเขียนโปรแกรมเล่มที่ 2, ออก Popl , Jan. 2018, บทความหมายเลข 29
ที่ใช้ Psyche-C:
Slade: ตัวถอดรหัสแบบจำลองภาษาขนาดเล็กแบบพกพาสำหรับการประกอบที่ดีที่สุด
การดำเนินการประชุมวิชาการ IEEE/ACM International เกี่ยวกับการสร้างรหัสและการเพิ่มประสิทธิภาพ - CGO , 2024
Anghabench: ชุดที่มีมาตรฐาน C รวบรวมได้หนึ่งล้านรายการสำหรับการลดขนาดรหัส
การดำเนินการประชุมวิชาการ IEEE/ACM International เกี่ยวกับการสร้างรหัสและการเพิ่มประสิทธิภาพ - CGO , 2021
การสร้างอินพุต in-bounds สำหรับอาร์เรย์ในภาษาหน่วยความจำไม่ปลอดภัย
การดำเนินการประชุมวิชาการ IEEE/ACM International เกี่ยวกับการสร้างรหัสและการเพิ่มประสิทธิภาพ - CGO , Feb. 2019, p. 136-148
คำอธิบายประกอบอัตโนมัติของงานในรหัสที่มีโครงสร้าง
การดำเนินการประชุมนานาชาติเกี่ยวกับสถาปัตยกรรมคู่ขนานและเทคนิคการรวบรวม - PACT , พ.ย. 2018, บทความหมายเลข 31