在处理大型C/C++项目时,您是否对源文件或头文件中的#include有一些特定规则?
例如,我们可以想象遵循这两个过多的规则之一:
我想在任何项目之间存在权衡,但你的是什么?你有更具体的规则吗?或任何解决任何解决方案的链接?
我知道如何通过这种方式轻松生成列表:
echo {a,b,c,d}_{0..3}
这会给:
a_0 a_1 a_2 a_3 b_0 b_1 b_2 b_3 c_0 c_1 c_2 c_3 d_0 d_1 d_2 d_3
但是如何生成相同的列表,但第二个大括号的优先级更高,以获得这个?:
a_0 b_0 c_0 d_0 a_1 b_1 c_1 d_1 a_2 b_2 c_2 d_2 a_3 b_3 c_3 d_3
任何技巧,比如从末尾或字符n中排序都可以,只要它适合一行.我也在使用zsh,但使用bash的东西很好.
考虑下面的简单程序:
__attribute__((weak)) void weakf(void);
int main(int argc, char *argv[])
{
weakf();
}
Run Code Online (Sandbox Code Playgroud)
当用 gcc 编译它并在 Linux PC 上运行它时,它会出现段错误。在 ARM CM0 (arm-none-eabi-gcc) 上运行它时,链接器通过跳转到以下指令和 nop 替换未定义的符号。
这种行为记录在哪里?是否有可能通过命令行选项更改它?我已经通过GCC和LD文档,没有关于这方面的信息。
但是,如果我检查 ARM 编译器文档,则会清楚地解释这一点。
我有一个非常大的驱动程序模块,我正在尝试编译最近的Linux内核(3.4.4).我可以insmod
使用2.6.27.25内核成功编译和使用相同的模块.GCC版本也不同,4.7.0对4.3.0.请注意,此模块非常复杂,我不能简单地浏览所有代码和所有makefile.
当"插入"模块时,我得到一个Cannot allocate memory
带有以下痕迹:
vmap allocation for size 30248960 failed: use vmalloc=<size> to increase size.
vmalloc: allocation failure: 30243566 bytes
insmod: page allocation failure: order:0, mode:0xd2
Pid: 5840, comm: insmod Tainted: G O 3.4.4-5.fc17.i686 #1
Call Trace:
[<c092702a>] ? printk+0x2d/0x2f
[<c04eff8d>] warn_alloc_failed+0xad/0xf0
[<c05178d9>] __vmalloc_node_range+0x169/0x1d0
[<c0517994>] __vmalloc_node+0x54/0x60
[<c0490825>] ? sys_init_module+0x65/0x1d80
[<c0517a60>] vmalloc+0x30/0x40
[<c0490825>] ? sys_init_module+0x65/0x1d80
[<c0490825>] sys_init_module+0x65/0x1d80
[<c050cda6>] ? handle_mm_fault+0xf6/0x1d0
[<c0932b30>] ? spurious_fault+0xae/0xae
[<c0932ce7>] ? do_page_fault+0x1b7/0x450
[<c093665f>] sysenter_do_call+0x12/0x28
-- clip --
Run Code Online (Sandbox Code Playgroud)
显而易见的答案似乎是模块分配了太多内存,但是:
因此,我怀疑新内核的问题与有限的内存没有直接关系.
新内核抱怨 …
我最近购买了搭载 Android 12 的三星 Galaxy S20 FE,我很快注意到许多应用程序无法访问 SD 卡上的文件。例如,我曾经从不同的浏览器或音乐播放器访问本地 HTML/MP3 文件。在我的新系统上,这些应用程序可以查看文件夹并浏览它们,但无法打开甚至列出任何常规文件。有一些例外,例如 Total Commander 或 AIMP。
据我了解,这是 Google 的一项政策更改,出现在 Android 11 (API/SDK 30) 上:https ://www.xda-developers.com/android-11-all-files-access-permission-form/
我尝试了一些可以在网上找到的解决方案,例如:
pm grant com.XXX.YYY android.permission.MANAGE_EXTERNAL_STORAGE
appops set --uid com.XXX.YYY android:legacy_storage allow
这不起作用,因为应用程序(我尝试使用 Opera)可能在安装过程中没有请求此权限。此外,我能找到的大多数解决方案都与正在开发的应用程序相关,而不是从商店安装的应用程序。例如:Android 11 范围存储权限
我可以找到的一个解决方法是将所有文件移入/storage/SD_CARD_ID/Android/data/com.XXX.YYY/files
,但是,这意味着每次安装新应用程序以及我使用的每个应用程序时都必须复制这些文件,如果我有 GB 的 MP3 或其他文件,这是非常愚蠢的媒体。在 URL 栏中输入完整路径也非常繁琐,因为无法轻松导航到或打开此文件夹。
因此,我试图找到一种方法来默认为所有应用程序启用权限,或者至少找到一种通过 GUI 来执行此操作的简单方法。例如,我尝试/etc/permissions/platforms.xml
进行一些或多或少的随机尝试进行调整,因为我找不到有关该文件语法的任何文档,但没有任何效果。
请注意,我的手机已root。
我有一个包含这种路径的文件:
C:\bad\foo.c
C:\good\foo.c
C:\good\bar\foo.c
C:\good\bar\[variable subdir count]\foo.c
Run Code Online (Sandbox Code Playgroud)
我想得到以下文件:
C:\bad\foo.c
C:/good/foo.c
C:/good/bar/foo.c
C:/good/bar/[variable subdir count]/foo.c
Run Code Online (Sandbox Code Playgroud)
请注意,不应修改非匹配路径.
我知道如何使用sed固定数量的子目录中做到这一点,但一个变量号给我找麻烦.事实上,我将不得不使用许多s/x/y/
表达式(多达最大深度...不是很优雅).
可能是awk,但这种魔法超出了我的技能.
仅供参考,我需要这个技巧来纠正cygwin平台上的一些gcov二进制文件.
我正在处理二进制文件; 因此,我可能会有以下类型的数据:
bindata\bindata%bindataC:\good\foo.c
Run Code Online (Sandbox Code Playgroud)
应翻译为:
bindata\bindata%bindataC:/good/foo.c
Run Code Online (Sandbox Code Playgroud)
第一个\
不得翻译,尽管它是在同一条线上.
但是,我.gcno
在编辑此文本时检查了我的文件,看起来所有路径都是零,所以下面的大多数答案都应该适合.
有时以前在带有简单MMU的嵌入式系统上工作时,我曾经动态编程这个MMU以检测内存损坏.
例如,在运行时的某个时刻,foo变量被一些意外数据覆盖(可能是通过悬空指针或其他任何东西).所以我添加了额外的调试代码:
这实际上是某种观察点,但直接由代码本身自行处理.
现在,我想重用相同的技巧,但在x86平台上.问题是我很难理解在这个平台上如何使用MMU,以及Linux如何使用它,但我想知道是否已经存在任何库/工具/系统调用来处理这个问题.
请注意,我知道存在各种工具,如Valgrind或GDB来管理内存问题,但据我所知,这些工具都不会被调试代码动态重新配置.
我主要对Linux下的用户空间感兴趣,但也欢迎任何关于内核模式或Windows下的信息!
我的代码是这样的:
def f1():
return 2, 3
def f2():
return 1, f1()
Run Code Online (Sandbox Code Playgroud)
我可以:
a, (b, c) = f2()
Run Code Online (Sandbox Code Playgroud)
我想要做:
a, b, c = f2()
Run Code Online (Sandbox Code Playgroud)
我能找到的所有解决方案都需要使用大量疯狂的括号/括号,或创建一个使用*
运算符的标识函数.我想只修改f2().
有什么比这更简单的了吗?
我从一个众所周知的基准测试中得到了以下函数,我正在使用它进行编译gcc-arm-none-eabi-10-2020-q4-major
:
#include <unistd.h>
double b[1000], c[1000];
void tuned_STREAM_Scale(double scalar)
{
ssize_t j;
for (j = 0; j < 1000; j++)
b[j] = scalar* c[j];
}
Run Code Online (Sandbox Code Playgroud)
我正在使用以下编译器选项:
arm-none-eabi-gcc -O3 -mcpu=cortex-m7 -mthumb -mfloat-abi=hard -mfpu=fpv5-sp-d16 -c test.c
但是,如果我检查编译后的代码,编译器似乎无法使用基本的 FPU 乘法指令,而仅使用以下函数__aeabi_dmul
(但是我们可以看到使用了libgcc
FPU ):vmov
00000000 <tuned_STREAM_Scale>:
0: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
4: 4c08 ldr r4, [pc, #32] ; (28 <tuned_STREAM_Scale+0x28>)
6: 4d09 ldr r5, [pc, #36] ; (2c <tuned_STREAM_Scale+0x2c>)
8: f504 58fa add.w …
Run Code Online (Sandbox Code Playgroud) 我想知道如何在C中定义一个对象,其引用将为null?
// definition of foo
...
void * bar = &foo; // bar must be null
Run Code Online (Sandbox Code Playgroud)
有一些方法我可以找到它,但没有一个符合我的需要.
__attribute__((weak)) extern int foo; //not working with cygwin/gcc 3.4
__attribute__((at(0))) int foo; //only with rvds
#define foo (*(int*) 0) //cannot be embedded in a macro
Run Code Online (Sandbox Code Playgroud)
实际上,我更喜欢符合标准的解决方案(c99),但任何正常工作都可以.
编辑:这样做的原因是bar不会总是为空.这是一个更相关的例子:
// macro that will define foo to a real object or to *null
DECL(foo);
int * bar = &foo;
if(bar) {
// we can call func
func(bar);
} else {
// bar undefined
exit(-1);
}
Run Code Online (Sandbox Code Playgroud)
当然这仍然不是很相关,因为我可以在我的条件下使用#if.该项目实际上涉及大型结构,大量文件,一些编译器,一些cpu目标,以及许多程序员,他们生成的错误概率指数与他们使用的语法的复杂性呈指数关系.这就是为什么我想要一个简单的宏来声明我的foo对象.
c ×5
c++ ×2
gcc ×2
android ×1
arm ×1
awk ×1
bash ×1
coding-style ×1
cortex-m ×1
cygwin ×1
debugging ×1
fpu ×1
gcov ×1
header ×1
include ×1
insmod ×1
kernel ×1
lcov ×1
ld ×1
linker ×1
linux ×1
linux-kernel ×1
permissions ×1
python ×1
sed ×1
tuples ×1
unpack ×1
vmalloc ×1
watchpoint ×1
weak ×1
zsh ×1