Cracking C++(9): 编译选项的设置

news2024/11/24 22:26:55

文章目录

    • 1. 目的
    • 2. 生成 hello 可执行程序的过程
    • 3. 编译选项
    • 4. overlook 项目简介
      • 4.1 基本用法
      • 4.2 典型例子: 函数缺少返回值

1. 目的

对应到 hackingcpp 网站上 Hello World 这一节内容的笔记和个人的拓展。

2. 生成 hello 可执行程序的过程

#include <iostream>
// our first program
int main ()
{
 std::cout << "Hello World\n";
}

C++ is a compiled language

source code can't be run directly
code is written to an abstract machine model (more on that later)
compiler translates source code into binary machine code understood by the CPU
program that can be run = binary executable file containing machine code

源代码(hello.cpp)经过预处理 -> 编译 -> 链接 的过程, 生成可执行文件。

在这里插入图片描述

3. 编译选项

作者给出的完整的编译命令是:

g++ -std=c++20 -Wall -Wextra -Wpedantic -Wshadow input.cpp -o output

并给出了解释:

-std=c++20 Sets compiler to the C++20 standard. Highly Recommended.

-Wall
-Wpedantic
-Wextra
-Wshadow

Enable compiler warnings. Highly recommended. These don’t really activate all warnings, but rather the most important ones that don’t produce too much (false positive) noise.

-o Sets the name of the output (executable) file.

个人推荐的命令则是:

clang++ -std=c++17 -fPIC -Wall input.cpp -o output

解释一下:

  • 个人推荐 Clang 胜过 GCC
  • 个人认为 C++20 在实际工作环境中,尤其是 adas 嵌入式环境、手机 NDK 开发环境中, 尤其要处理老代码时, 实际用的编译器版本未必支持 C++20,C++17 即可
  • -fPIC 没有被提到, 但是确是非常有必要的一个选项, 比如 Clang 编译的 gtest 要给 GCC 用, 不开 fPIC 会导致链接失败
  • -Wall 确实是一个容易被误会的选项,让人误以为 “treat all warning as error”, 但实际并不对应所有 warning
  • -Wpedentic, -Wextra, -Wshadow 看起来更安全了, 但是呢这远远不够, 推荐使用个人整理的 overlook 项目, 列出了30条左右的规则, 无论是写 C, 还是C++, 都能让你更安全

4. overlook 项目简介

4.1 基本用法

需要你的项目是基于 CMake 构建, 然后把 overlook.cmake 当插件一样使用

include(overlook.cmake)

然后, 按常规的编译步骤, 就可以了:

cd /path/to/your/project
cmake -S . -B build
cmake --build build # 执行编译

此时, 如果你的代码有不安全的地方, 编译器会自动报告出来。

4.2 典型例子: 函数缺少返回值

在 Android NDK 平台上, 如果函数函数返回值类型不是 void, 但是却没有返回值, 或者说有一条代码执行路径是没有返回值的, 编译器并不会报错。没错,不会报错!!

于是乎, 你编译的程序, 在手机运行时出现了 Crash, 看 Log 说是 “Trap”, 云里雾里。

实际上就是没有返回值导致的。编译器其实报告了一个 warning, 但如果你没注意到这条 warning, 就会遇到 Trap。既然这么重要的 warning 编译器并没有作为 error, 我们就主动把它作为 error, 没错, overlook 帮你做好了:

# Rule 4. 函数应该有返回值但没有 return 返回值;或不是所有路径都有返回值
# 解决bug:lane detect; vpdt for循环无法跳出(android输出trap); lane calib库读取到随机值导致获取非法格式asvl,开asan则表现为读取NULL指针
# -O3时输出内容和其他优化等级不一样(from 三老师)
if(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
  overlook_list_append(OVERLOOK_C_FLAGS /we4716 /we4715)
  overlook_list_append(OVERLOOK_CXX_FLAGS /we4716 /we4715)
else()
  overlook_list_append(OVERLOOK_C_FLAGS -Werror=return-type)
  overlook_list_append(OVERLOOK_CXX_FLAGS -Werror=return-type)
endif()

作为验证,请使用如下故意写bug的代码, 分别尝试不使用overlook和使用overlook的编译输出, 其中使用 overlook 后会编译报错,提前告知问题所在:

#include <stdio.h>

int print_data(int* data, int len)
{
    for (int i = 0; i < len; i++)
    {
        printf("%d ", data[i]);
    }
    printf("\n");
}

void example1()
{
    int data[10];
    for (int i = 0; i < 10; i++)
    {
        data[i] = i;
    }
    int res = print_data(data, 10);

    printf("res=%d\n", res);
}

//---------------------

int func1(int i)
{
    if (i)
        return 3; // C4715 warning, nothing returned if i == 0
}

void fatal()
{
}
int glue()
{
    if (0)
        return 1;
    else if (0)
        return 0;
    else
        fatal(); // C4715
}

void example2()
{
    func1(233);
    int qaq = glue();
    printf("%d\n", qaq);
}

//-----------------------------

int main()
{
    example1();
    example2();

    return 0;
}

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

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

相关文章

牛客网专项练习——C语言错题集(3)

文章目录 函数的缺省返回值类型找不同数组指针 函数指针const 与 指针函数里操作外面传进来的数组 函数的缺省返回值类型 “在C语言中&#xff0c;凡不加返回值类型限定的函数&#xff0c;就会被编译器作为返回整型值处理。” 这是初学学 C 语言时有接触到的一个概念&#xf…

RK3588平台开发系列讲解(进程篇)进程task_struct结构体详解(一)

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、任务 ID二、信号处理三、任务状态四、进程调度沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 Linux 里面,无论是进程,还是线程,到了内核里面,我们统一都叫任务(Task),由一个统一的结构 task_stru…

1.uniapp可视化操作-diygw

DAY1-uniapp可视化操作:DIY可视化-拖拽设计1天搞定主流小程序环境安装 文章目录 DAY1-uniapp可视化操作:DIY可视化-拖拽设计1天搞定主流小程序环境安装前言一、DIY可视化桌面客户端安装:二、小皮管理面板phpstudy(或者宝塔桌面)三、phpstorm开发工具:四、Vs Code安装:五、hbuil…

《Java Web轻量级整合开发入门》学习笔记

轻量级Java Web整合开发 第一章 轻量级Java Web开发概述 1.2 java web 开发概述 1.JSP是一种编译执行的前台页面技术。对于每个JSP页面&#xff0c;Web服务器都会生成一个相应的Java文件&#xff0c;然后再编译该Java文件&#xff0c;生成相应的Class类型文件。在客户端访问到…

chatgpt赋能python:Python怎么合并字典

Python怎么合并字典 在Python编程中&#xff0c;字典是一种非常有用的数据结构。它由一组键值对组成&#xff0c;每个键值对都是一个键和对应的值。有时候&#xff0c;我们需要将两个或多个字典合并为一个大的字典。本文将介绍Python中合并字典的方法。 方法一&#xff1a;使…

[架构之路-212]- 需求- UML需求建模:用例图、ER图/概念类图、流程图、序列图、状态机图

目录 前言&#xff1a; 什么是需求建模 1. 用例图 1.1 用例图 1.1.1 组件 1.1.2 用例细化与用例关系 1.2 用例规约 2. ER图/概念类图 3. 跨角色流程图&#xff08;串行、协同&#xff09; 4. 活动图&#xff08;并行、协同&#xff09; 5. 状态机图 6. 时序图 前言…

Letcode经典黄题——三数之和

还是那句话&#xff0c;一个题思路很重要&#xff0c;没有思路等于无头苍蝇乱撞 题目要求&#xff1a;给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 …

chatgpt赋能python:Python怎么变黑?探索Python黑科技的奥秘

Python怎么变黑&#xff1f;探索Python黑科技的奥秘 如果你在网上搜索“Python怎么变黑”&#xff0c;你会看到很多关于Python黑客技术的讨论。但是&#xff0c;这篇文章将会聚焦于Python如何变得更“黑”&#xff0c;即在SEO优化方面如何利用Python。 Python在SEO优化中的作…

华硕天选4原装Windows11系统带ASUSRECOVERY恢复工厂模式安装

华硕工厂恢复系统 &#xff0c;安装结束后带隐藏分区以及机器所有驱动软件,奥创Myasus Recovery 文件地址https://pan.baidu.com/s/1Pq09oDzmFI6hXVdf8Vqjqw?pwd3fs8 提取码:3fs8 文件格式&#xff1a;5个底包(HDI KIT COM MCAFEE EDN) 1个引导工具TLK 支持ASUSRECOVERY型…

chatgpt赋能python:Python和Envi:完美结合的最佳方案

Python和Envi&#xff1a;完美结合的最佳方案 如果你正在寻找一种可靠的方法来将Python编程与Envi软件结合起来&#xff0c;那么你来对地方了&#xff01;在本篇文章中&#xff0c;我们将介绍如何使用Python编程语言和Envi软件相互结合&#xff0c;从而让你的数据分析和地理信…

价值8k的电子书小程序源码+前端(含教程)

&#x1f388; 限时活动领体验会员&#xff1a;可下载程序网创项目短视频素材 &#x1f388; &#x1f389; 有需要的朋友记得关赞评&#xff0c;阅读文章底部来交流&#xff01;&#xff01;&#xff01; &#x1f389; ✨ 源码介绍 价值8k的电子书小程序源码_附完整教程 无意…

chatgpt赋能python:Python的字符串处理功能:取出字符串的每一位

Python的字符串处理功能&#xff1a;取出字符串的每一位 Python是广泛应用于Web开发、数据分析、机器学习、人工智能和爬虫等领域的一门程序语言。其中&#xff0c;字符串是Python最常见的数据类型之一&#xff0c;也是Web开发中交互数据的主要形式。在Python中&#xff0c;字…

UDS关于0x34服务请求下载学习

1.服务介绍 客户端使用requestDownload服务启动从客户端到服务器的数据传输&#xff08;下载&#xff09;。在服务器收到requestDownload请求消息后&#xff0c;服务器应采取一切必要措施接收数据&#xff0c;然后再发送肯定响应消息。 2.请求消息 2.1请求消息定义 C1&#x…

javaSE -- 注解学习笔记

参考资料&#xff1a;https://blog.csdn.net/KingBoyWorld/article/details/105337011 https://blog.csdn.net/qq_42843172/article/details/107293408 1.注解是什么&#xff1f; java注解是一个写在接口、类、属性方法上的一个标签。跟注释不同&#xff0c;能够影响代码。 …

算法模板(5):数学(1):数学知识(1)

数论 整数的整除性 [x]表示不超过x的最大整数&#xff0c;叫做取整函数或高斯函数。设整数a&#xff0c;b不同时为零&#xff0c;则存在一对整数m&#xff0c;n&#xff0c;使得 ( a , b ) a m b n (a, b) am bn (a,b)ambn。注&#xff1a;a和b的最大公因数会写成 (a, b)…

vue3中使用Vuex

目录 什么是Vuex安装和配置Vuex安装Vuex配置Vuex 使用VuexState定义State访问State MutationsMutations 的特点定义Mutations触发Mutations 修改State中的状态 ActionAction 的特点和作用定义Action触发Action GetterGetter 的特点和作用定义Getter获取Getter ModuleModule 的特…

ARM基础(4):L1 Cache之I-Cache和D-cache详解

在上一篇文章ARM基础(3)&#xff1a;MPU内存保护单元详解及例子中&#xff0c;我介绍了MPU&#xff0c;我们知道MPU允许按区域修改一级Cache的属性&#xff0c;这个Cache一般为L1 Cache&#xff0c;它位于CPU的内部&#xff0c;用来加快指令和数据的访问速度。同时&#xff0c;…

chatgpt赋能python:如何在Python和Java之间进行整合

如何在Python和Java之间进行整合 在现在这个编程的时代里&#xff0c;使用一种编程语言或一种技术通常不能满足所有的需求。因此&#xff0c;当你需要在Python和Java之间进行整合时&#xff0c;这篇文章就为你介绍了一些解决方案。 为什么需要Python和Java进行整合 Python和…

redis 字典的实现

1.数据结构 节点数据结构 因为是基于开链法的哈希表实现&#xff0c;所以需要维护了一个next节点 typedef struct dictEntry {void *key;union {void *val;uint64_t u64;int64_t s64;double d;} v;struct dictEntry *next; } dictEntry; 复制 哈希表数据结构 其中size是当…

景区旅游多商户版小程序v14.3.1+前端

&#x1f388; 限时活动领体验会员&#xff1a;可下载程序网创项目短视频素材 &#x1f388; &#x1f389; 有需要的朋友记得关赞评&#xff0c;文章底部来交流&#xff01;&#xff01;&#xff01; &#x1f389; ✨ 源码介绍 【新增】全新授权登录支持取消登录 【新增】商…