备忘 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_whole

make -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 :=@
endif

SRC_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-group

LLVMLIBS = $(shell $(LLVM_CONFIG) --libs)

PROJECT = hello_diagnostic
PROJECT_OBJECTS = hello_diagnostic.o

default: $(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 对应版本安装的路径;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习的魔法(一)从零开始理解吴恩达的精炼笔记

一、机器学习是什么&#xff1f; 1、机器学习的概念 机器学习是一种人工智能领域的技术和方法&#xff0c;旨在使计算机系统能够从经验数据中自动学习和改进&#xff0c;而无需显式地进行编程。它涉及开发算法和模型&#xff0c;使计算机能够自动分析和理解数据&#xff0c;并…

MES组件车间解决方案:提高生产管理效率和质量的关键

市场环境的变化得越来越恶劣&#xff0c;现代生产管理理念不断更新&#xff0c;制造型企业是否进入管理的良性循环&#xff0c;关键在于“计划”与“执行”的密切配合&#xff0c;企业和车间管理人员必须在最短的时间内掌握生产现场的变化&#xff0c;并做出准确的判断和应对措…

龙芯第四代3A6000主板与龙芯3A500龙架构兼容,具备丰富的接口和扩展性

龙芯 3A6000 处理器完全自主设计、性能优异&#xff0c;代表了我国自主桌面 CPU 设计领域的最新里程碑成果。龙芯 3A6000 处理器的推出&#xff0c;说明国产 CPU 在自主可控程度和产品性能上已双双达到新高度&#xff0c;也证明了国内有能力在自研 CPU 架构上做出一流的产品。 …

洗车行业小程序源码系统 带完整的安装代码包以及搭建教程

大家好&#xff01;今天来给大家分享一款洗车行业小程序源码系统&#xff0c;通过小程序&#xff0c;用户可以方便地预约洗车服务、查看服务进度&#xff0c;洗车店也可以实时管理订单、安排人员&#xff0c;从而提高服务效率。同时&#xff0c;小程序界面简洁明了&#xff0c;…

蓝牙耳机什么牌子好?全价位段盘点,真人实测带你避开雷区!

​无线耳机已经成为现代生活中的必备数码产品&#xff0c;尤其在感受到无线带来的自由后&#xff0c;很难再适应有线耳机的束缚。因此&#xff0c;耳机市场竞争激烈&#xff0c;各种类型和外观的耳机层出不穷。在此&#xff0c;我为大家总结了五款使用体验很不错的蓝牙耳机&…

VsCode搭建Spring Boot项目环境

VsCode搭建Spring Boot项目环境 1、前提条件&#xff1a;配置Java环境 下载安装JDK配置环境变量 2、VsCode配置SpringBoot环境 安装扩展 配置Maven 找到Maven配置文件&#xff0c;进行打开settings.json&#xff0c;添加如下代码&#xff1a; "workbench.iconThem…

工具 | 解决IDEA每次git拉取远程代码 default changelist 都会出现 .idea文件修改记录

问题描述&#xff1a; 每次我在拉取远程代码的时候&#xff0c;git都会默认将 .idea当中的文件&#xff08;例如&#xff1a;compiler.xml or workspace.xml&#xff09;都会莫名其妙的自动修改。 这里吐槽一下很离谱的一个现象&#xff0c;仔细看下修改的内容&#xff0c;最离…

邮件营销新手必读指南?怎样做好邮件营销?

邮件营销的全流程及步骤&#xff1f;做好邮件营销有哪些注意点&#xff1f; 邮件营销作为一种传统却依然高效的推广手段&#xff0c;被众多企业所青睐。对于新手来说&#xff0c;如何开展邮件营销&#xff0c;却是一个值得探讨的话题。AokSend将为你提供一份邮件营销新手必读指…

盘点热门的5个AI视频工具(上):附保姆级教程,居然还有免费的?(建议收藏)

一条完全使用 AI 做出的短视频&#xff0c;点赞上万&#xff0c;转发上万&#xff01; 你敢信&#xff0c;这是我在前几天刷视频的时候&#xff0c;看到的一个 AI 视频案例。 这种 AI 视频为什么会火&#xff1f; AI 虽然不是什么新的领域&#xff0c;但 2023 年&#xff0c…

mini-spring|把AOP动态代理,融入到Bean的生命周期

本文完成 AOP 核心功能与 Spring 框架的整合&#xff0c;最终能通过在 Spring 配置的方式完成切面的操作。 解决问题&#xff1a; 怎么借着 BeanPostProcessor 把动态代理融入到 Bean 的生命周期中&#xff0c;以及如何组装各项切点、拦截、前置的功能和适配对应的代理器。 …

c++ 中const

对于基础类型直接赋值 void test01(){const int data10;cout<<"data"<<data<<endl;int * p (int*)&data;*p 1000;cout<<"*p"<<*p<<endl;cout<<"after data"<<data; } c中&#xff0c;对于…

Github 2024-03-02 开源项目日报Top9

根据Github Trendings的统计&#xff0c;今日(2024-03-02统计)共有9个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量非开发语言项目2Rust项目1JavaScript项目1Shell项目1C项目1TypeScript项目1C#项目1Python项目1 任天堂Switch模…

47. 【Linux教程】逻辑卷的简单使用

本小节介绍创建 LVM 的步骤&#xff0c;并介绍如何简单的使用 LVM&#xff0c;主要分为&#xff1a;定义物理卷、创建卷组、创建逻辑卷、创建文件系统、修改 LVM。 1.LVM 中的几个概念 PV(physical volume)&#xff0c;物理卷在逻辑卷管理系统最底层&#xff0c;可为整个物理硬…

那些像白牌的品牌正在霸榜TikTok美区!国货之光闪耀海外!

北京时间 3 月 6 日&#xff0c;据路透社报道&#xff0c;美国两党国会议员在周二提出了一项法案&#xff0c;要求字节跳动公司剥离对旗下短视频应用 TikTok 的控制权&#xff0c;否则就禁止应用商店上架分发 TikTok。 TikTok 对此回应称&#xff1a;“无论提案人如何掩饰&…

在线免费预览查看 Axure rp 原型

Axure RP 不仅可以绘制详细的产品概念&#xff0c;还可以在浏览器中生成 html 页面进行参考&#xff0c;但需要安装插件才能打开。安装 Axure rpchrome 插件之后&#xff0c;还需要在扩展程序中选择 “允许访问文件网站”&#xff0c;否则无法在 Axure 中成功。 在线查看原型。…

基于深度学习的驾驶员分心驾驶行为(疲劳+危险行为)预警系统使用YOLOv5+Deepsort实现驾驶员的危险驾驶行为的预警监测

人物专注性检测 项目快速预览 主要不同地方为&#xff1a; 1、疲劳检测中去掉了点头行为的检测&#xff0c;仅保留闭眼检测和打哈欠检测。 2、Yolov5的权重进行了重新训练&#xff0c;增加了训练轮次。 3、前端UI进行了修改&#xff0c;精简了部分功能。 项目介绍 该项目…

0基础学习VR全景平台篇第143篇:限定访问功能

大家好&#xff0c;欢迎观看蛙色VR官方——后台使用系列课程&#xff01;这期&#xff0c;我们将为大家介绍如何使用限定访问功能。 一.什么是限定访问功能&#xff1f; 限定访问&#xff0c;就是可以在编辑后台设置可以访问作品的用户的类型&#xff0c;还有可以访问作品的IP…

某准网招聘接口逆向之WebPack扣取

​​​​​逆向网址 aHR0cHM6Ly93d3cua2Fuemh1bi5jb20v 逆向链接 aHR0cHM6Ly93d3cua2Fuemh1bi5jb20vc2VhcmNoP3BhZ2VOdW09MSZxdWVyeT1weXRob24mdHlwZT01 逆向接口 aHR0cHM6Ly93d3cua2Fuemh1bi5jb20vYXBpX3RvL3NlYXJjaC9qb2IuanNvbg 逆向过程 请求方式&#xff1a;GET 参数构成…

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

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

vue实现文字手工动态打出效果

vue实现文字手工动态打出效果 问题背景 本文实现vue中&#xff0c;动态生成文字手动打出效果。 问题分析 话不多说&#xff0c;直接上代码&#xff1a; <template><main><button click"makeText"><p class"text">点击生成内容…