备忘 clang diagnostic 类的应用示例 ubuntu 22.04

系统的ncurses环境有些问题

通过源码安装了ncurses6.3后,才可以在 llvmort-18.1.rc4中编译通过示例:

1,折腾环境

 ncurses-6.3$ ./configure
 ncurses-6.3$ make -j
 ncurses-6.3$ sudo make install
 
 
 sudo apt install libtinfo5
 sudo apt install libtinfo
 sudo apt-get install lib64tinfo6
 $ sudo apt-get install libtinfo-dev

2,编译llvmorg-18.1.rc4

Debug 版本,link 时容易爆掉内存,故make -j N 的 N 可以小一点,此处256GB内存,选了N==16,没有问题,32,34,36都不行。


cmake -G "Unix Makefiles" ../llvm      -DLLVM_ENABLE_PROJECTS="bolt;clang;clang-tools-extra;compiler-rt;cross-project-tests;libc;libclc;lld;lldb;mlir;openmp;polly;pstl;flang"      -DLLVM_BUILD_EXAMPLES=ON           -DLLVM_TARGETS_TO_BUILD="host"      -DCMAKE_BUILD_TYPE=Debug           -DLLVM_ENABLE_ASSERTIONS=ON           -DLLVM_ENABLE_RUNTIMES=all             -DLLVM_BUILD_LLVM_DYLIB=ON              -DCMAKE_INSTALL_PREFIX=../../local_wholemake -j 16
16物理核,不用超线程 make install

3,示例

cat set_env.sourceme
 

export PATH=/home/hipper/llvm_3_4_0_ex/browse_llvm_17/local/bin:$PATH
export LD_LIBRARY_PATH=/home/hipper/llvm_3_4_0_ex/browse_llvm_17/local/lib:$LD_LIBRARY_PATH

Makefile

LLVM_CONFIG ?= llvm-config
#CXX := clang++
ifndef VERBOSE
QUIET :=@
endifSRC_DIR ?= $(PWD)
LDFLAGS += $(shell $(LLVM_CONFIG) --ldflags) 
COMMON_FLAGS = -Wall -Wextra
CXXFLAGS += $(COMMON_FLAGS) $(shell $(LLVM_CONFIG) --cxxflags)
LCXX :=$(shell $(LLVM_CONFIG) --cxxflags)
CPPFLAGS += $(shell $(LLVM_CONFIG) --cppflags) -I$(SRC_DIR)CLANGLIBS = \-Wl,--start-group \-lclang \-lclangFrontend \-lclangDriver \-lclangSerialization \-lclangParse \-lclangSema \-lclangAnalysis \-lclangEdit \-lclangAST \-lclangLex \-lclangBasic \-Wl,--end-groupLLVMLIBS = $(shell $(LLVM_CONFIG) --libs)PROJECT = hello_diagnostic
PROJECT_OBJECTS = hello_diagnostic.odefault: $(PROJECT)%.o : $(SRC_DIR)/%.cpp@echo Compiling $*.cpp$(QUIET)$(CXX) -c $(CPFLAGS) $(CXXFLAGS) $<$(PROJECT) : $(PROJECT_OBJECTS) @echo Linking $@$(QUIET)$(CXX) -o $@ $(LDFLAGS) $^ $(CLANGLIBS) $(LLVMLIBS) -lncurses.PHONY: clean
clean:$(QUIET)rm -f $(PROJECT) $(PROJECT_OBJECTS).PHONY: echo
echo:@echo "CXX 	is	$(CXX)"@echo "LDFLAGS 	is	$(LDFLAGS)}"@echo "CXXFLAGS	is	$(CXXFLAGS)"@echo "CPPFLAGS	is	$(CPPFLAGS)"@echo "SRC_DIR	is	$(SRC_DIR)"

hello_diagnostic.cpp

extern "C"{
#include "clang-c/Index.h"
}#include "llvm/Support/CommandLine.h"
#include <iostream>using namespace llvm;static cl::opt<std::string> FileName(cl::Positional, cl::desc("Input file"), cl::Required);int main(int argc, char** argv)
{cl::ParseCommandLineOptions(argc, argv, "Diagnostics Example");CXIndex index = clang_createIndex(0, 0);const char* args[]={"-I/usr/include","-I."};CXTranslationUnit translationUnit = clang_parseTranslationUnit(index, FileName.c_str(), args, 2, NULL, 0, CXTranslationUnit_None);unsigned diagnosticCount = clang_getNumDiagnostics(translationUnit);for(unsigned i=0; i<diagnosticCount; ++i){CXDiagnostic diagnostic = clang_getDiagnostic(translationUnit, i);CXString category = clang_getDiagnosticCategoryText(diagnostic);CXString message = clang_getDiagnosticSpelling(diagnostic);unsigned severity = clang_getDiagnosticSeverity(diagnostic);CXSourceLocation loc = clang_getDiagnosticLocation(diagnostic);CXString fName;unsigned line = 0, col = 0;clang_getPresumedLocation(loc, &fName, &line, &col);std::cout << ""<<severity<<" File: "<< clang_getCString(fName) << " Line: "<< line << " Col: " << col << " Category: \" "<< clang_getCString(category) << "\" Message: "<< clang_getCString(message) << std::endl;clang_disposeString(fName);clang_disposeString(message);clang_disposeString(category);clang_disposeDiagnostic(diagnostic);       }clang_disposeTranslationUnit(translationUnit);clang_disposeIndex(index);return 0;
}
hip

被诊断的带有错误的源码:

hello.c

int main(){printf("hello, world!\n")}

这里有两个错误,

1,没有#include <stdio.h> 故,没有声明 printf;

2,printf() 后面没有分号,违反了c语言的语法;

下图中被诊断了出来:

示例效果:

4, llvm 3.4.0 示例

同样的代码,在llvmorg-3.4.0 环境下测试也通过了:

cat set_env.sourceme


export PATH=/home/hipper/llvm_3_4_0_ex/browse/local/bin:$PATH
export LD_LIBRARY_PATH=/home/hipper/llvm_3_4_0_ex/browse/local/lib:$LD_LIBRARY_PATH

需要配置的环境:
export  PATH=
export  LD_LIBRARY_PATH=
llvm 对应版本安装的路径;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/720529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Visual Studio 2022 创建lib和dll并使用

概述&#xff1a;对于一个经常写javaWeb的人来说,使用Visual Studio似乎没什么必要&#xff0c;但是对于使用ffi的人来说&#xff0c;使用c或c编译器&#xff0c;似乎是必不可少的&#xff0c;下面我将讲述如何用Visual Studio 2022 来创建lib和dll&#xff0c;并使用。 静态库…

ABAP - SALV教程12 显示图标和提示信息

ALV要求字段的值为图标的需求并不多见&#xff0c;一般都用于红黄绿灯&#xff0c;来表示单据的执行状态&#xff0c;添加图标的方式也可以实现红黄绿灯的功能&#xff0c;也可以参考SALV实现红黄绿灯这篇文章&#xff1a;http://t.csdnimg.cn/Dzx7x效果图SAVL列设置为图标图标…

434G数据失窃!亚信安全发布《勒索家族和勒索事件监控报告》

最新态势快速感知 最新一周全球共监测到勒索事件90起&#xff0c;与上周相比数量有所增加。 lockbit3.0仍然是影响最严重的勒索家族&#xff1b;alphv和cactus恶意家族也是两个活动频繁的恶意家族&#xff0c;需要注意防范。 Change Healthcare - Optum - UnitedHealth遭受了…

详细分析服务器自动重启原因(涉及Linux、Window)

目录 前言1. Linux2. Window 前言 对于服务器异常重启的问题&#xff0c;需要定位原因并解决&#xff0c;下次就不会重启 1. Linux 要查看Linux服务器自动重启的原因&#xff0c;可以执行以下步骤&#xff1a; 检查系统日志&#xff1a;Linux系统通常会记录系统事件和错误信…

vue3页面内容切换(类似登录、注册内容切换)

一、内容描述 页面有俩块内容&#xff0c;分别是验证码登录页面内容&#xff0c;账号密码登录页面内容。有俩种处理方式&#xff0c;一个是写俩个页面跳转使用&#xff0c;还有一种是一个页面俩个内容&#xff0c;切换的只是不同的内容&#xff0c;相同的内容保留。一般都是选择…

通过人工智能增强的对话建立有意义的联系

人工智能如何重塑我们的交流&#xff1f;2024年最新对话AI趋势 在技术和人类互动比以往任何时候都更加复杂地交织在一起的时代&#xff0c;人工智能增强的对话已成为建立有意义的联系的关键要素。 这种转变不仅关乎效率&#xff0c;还关乎效率。 这是为了丰富沟通的结构。 在这…

12. Nginx进阶-Location

简介 Nginx的三大区块 在Nginx中主要配置包括三个区块&#xff0c;结构如下&#xff1a; http { #协议级别include /etc/nginx/mime.types;default_type application/octet-stream;log_format main $remote_addr - $remote_user [$time_local] "$r…

(十五)【Jmeter】取样器(Sampler)之HTTP请求

简述 操作路径如下: HTTP请求 (HTTP Sampler): 作用:模拟发送HTTP请求并获取响应。配置:设置URL、请求方法、请求参数等参数。使用场景:测试Web应用程序的HTTP接口性能。优点:支持多种HTTP方法和请求参数,适用于大多数Web应用程序测试。缺点:功能较为基础,对于复杂…

42、网络编程/多点通信和域套接字通信模型20240304

一、多点通信之广播的收发端实现 1.广播发送端代码&#xff1a; #include<myhead.h>int main(int argc, const char *argv[]) {int sfdsocket(AF_INET,SOCK_DGRAM,0);//创建套接字if(sfd-1){perror("socket,error");return -1;}int broadcast1;//设置套接字广…

opencv VideoCapture

videocapture顾名思义视频捕捉&#xff0c;主要是从视频文件、摄像头或网络摄像头获取视频流数据&#xff0c;并将其作为一系列帧进行处理。 我们这里主要实现了获取项目文件夹下的1.mp4视频文件&#xff0c;然后经过灰度变化、均值滤波、边缘检测然后将视频显示出来 #include…

ruoyi-vue-plus4.X版本实现内嵌swagger文档(简单解决方法)

1.在common模块中添加pom依赖 <dependency><groupId>org.webjars</groupId><artifactId>swagger-ui</artifactId><version>4.15.5</version></dependency>结果如下&#xff1a; 2.在ResourcesConfig配置类的addResourceHandl…

Git分支补充

我们在合并分支时并不总是一帆风顺&#xff0c;有些时候也会遇到“合并冲突”的问题。 下面我们来还原一下&#xff1a; 创建分支dev $ git checkout -b dev 切换到一个新分支 dev $ git branch * devmaster我们将 text.txt 内容改为 欢迎关注CSDNkeduo并将修改的内容提交到 d…

Linux-信号3_sigaction、volatile与SIGCHLD

文章目录 前言一、sigaction__sighandler_t sa_handler;__sigset_t sa_mask; 二、volatile关键字三、SIGCHLD方法一方法二 前言 本章内容主要对之前的内容做一些补充。 一、sigaction #include <signal.h> int sigaction(int signum, const struct sigaction *act,struc…

Prometheus结合Grafana监控MySQL,这篇不可不读!

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

动态规划:LeetCode第10题 正则表达式匹配

题目&#xff1a; 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s的&#xff0c;而不是部分字符串。 示例 1&#xff1a; …

软考57-上午题-【数据库】-数据库的控制功能

一、事务管理 1-1、事务的定义 事务是一个操作序列&#xff0c;这些操作&#xff0c;要么都做&#xff0c;要么都不做。 事务和程序是两个不同的概念&#xff0c;一般一个程序可以包含多个事务。 1-2、事务定义的语句 1、事务开始&#xff1a;BEGIN TRANSACTION 2、事务提…

【ES入门一:基础概念】

集群层面上的基础概念 集群 由多个es实例组成的叫做集群 节点 单个ES的服务实例叫做节点。每个实例都有自己的名字&#xff0c;就是在配置文件中配置的‘node.name’中的内容。为了标识每个节点&#xff0c;每个节点启动后都会分配一个UID&#xff0c;存储在data目录。每个…

线程的同步互斥机制3月4日

题目&#xff1a; 代码&#xff1a; #include <stdio.h> #include <pthread.h> #include <string.h> #include <semaphore.h> #include <unistd.h>sem_t sem1,sem2;void* callback1(void*arg) {while(1){if(sem_wait(&sem1)<0) //等待…

SwiftUI之CoreData详解(一)

coreData 是一种数据持久化的方案&#xff0c;是对SQLite的一种封装。一说到这种桌面化的数据库&#xff0c;我就无比的怀念Foxbase|Foxpro, 多好的数据库产品&#xff0c;被微软扼杀了&#xff0c;相当年教大学生妹子们国家二级数据库时都是手把手教的&#xff0c;呃~~~&#…

Java轻量延迟重试队列实现

背景 很多开放平台都使用Webhook的方式进行外部系统数据同步或者通知&#xff0c;对于Webhook请求的对外发送不进行重试显然有点说不过去。使用简单的while一个条件去重试N次好像达不到什么效果&#xff0c;只能是说有重试而已&#xff0c;而使用消息队列中间件好像依赖又太重…