我正在调试一个 C 程序,当它发现问题时,我对 AddressSanitizer 输出的下半部分感到非常困惑。例如,让我们使用它:
==33184==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000005 at pc 0x55f312fe2509 bp 0x7ffc99f5f5c0 sp 0x7ffc99f5f5b0
WRITE of size 1 at 0x602000000005 thread T0
#0 0x55f312fe2508 in main /home/user/c/friends/main.c:20
#1 0x7fa5ea0e9b96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)
#2 0x55f312fe21c9 in _start (/home/user/c/friends/cmake-build-debug/friends+0x11c9)
0x602000000005 is located 11 bytes to the left of 5-byte region [0x602000000010,0x602000000015)
allocated by thread T0 here:
#0 0x7fa5eb2b8b40 in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xdeb40)
#1 0x55f312fe23f4 in main /home/user/c/friends/main.c:18
#2 0x7fa5ea0e9b96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)
SUMMARY: AddressSanitizer: heap-buffer-overflow /home/user/c/friends/main.c:20 in …
Run Code Online (Sandbox Code Playgroud) 可以使用.NET Native将C#/ .NET应用程序编译为本机二进制文件而不是UWP应用程序吗?例如,4.5控制台应用程序?我在.NET Native上观看了超过2小时的视频,还阅读了文档,但他们没有明确回答这个问题.
我是一个组织的成员,该组织在 GitHub 上拥有很多私人存储库。我需要使用 GitHub API 从私有存储库获取数据。我正在使用以下 python 代码:
url = "https://api.github.com/orgs/myorg/repos?access_token=[mytokenhere]"
headers = {"Authorization": "token [myPATHhere]"}
session = requests.Session()
response = session.get(url, headers = headers)
content = response.text
my_json = json.loads(response.text)
for item in my_json:
print(item['html_url'])
Run Code Online (Sandbox Code Playgroud)
其中 PAT = 我的访问令牌。这仍然只返回公共存储库。我已经看到了相关的问题,但列出的解决方案并不能解决我的问题。请注意,我已授权我的访问令牌进入私有存储库。我还尝试过 api.github.com/users/repos 和 api.github.com/users/[myorghere] ,但仍然没有返回私人存储库。难道是我没有正确提交token吗?
Richard Reese所著的《理解和使用 C 指针》一书说:
空概念是空指针常量支持的抽象。这个常数可能是也可能不是一个常数零。AC 程序员不需要关心他们实际的内部表示。
我的问题是,由于“这个常数可能是也可能不是常数零”,我在我的代码中执行以下操作是否安全:
int *ptr = NULL;
// Some code which probably sets ptr to a valid memory address
if(!ptr)
{
ERROR();
}
Run Code Online (Sandbox Code Playgroud)
如果 NULL 不为 0,则 if 子句有可能评估为真。
在程序的构建和运行方式方面, .NET Core在内部实现方面与 .NET Framework 有何不同?我知道常规的 .NET Framework/C# 项目基本上被编译成 CIL 代码,分发,然后在运行时由 JITer 编译,最终将它们逐个函数地转换为机器代码(除非程序员指定了预编译选项)。这对于 .NET Core 应用程序也是如此吗?有什么主要区别吗?
注意事项:
是的,我知道这两件事都非常复杂,我不希望回答者详细解释每个小组件。
我以前听说过 .NET Framework 的 CLR 被称为虚拟机,但我知道这是有待辩论的,并且在诸如this one 之类的帖子中看到过这样的辩论,就像 CIL 与 Java 字节码的比较一样。这些都是无聊的论点,与问题无关。
我在那里发现了类似的问题,但是,这些问题似乎集中在 .NET Core 在我们作为客户端程序员的功能/可用性方面有何不同。这个问题与此无关,而是询问 .NET Core 在内部实现方面与 .NET Framework 有何不同。
谢谢你。
结构是C编程语言中的复合数据结构; 它们由诸如int和指针之类的基元组成,它们以相邻的方式放置在存储器中,例如阵列.
我的问题是,结构本身是由什么构成的?它们是一种阵列吗?例如,哈希表可以实现为链表列表.以类似的方式,什么是实现的结构?如果需要,请在x86汇编级别解释.谢谢.
这个虚线文件图标是什么意思?这是一个.cs文件,但它在我的项目中表现不正常,我在解决方案资源管理器中注意到了这个单独的图标:
我已经在三个地方检查了MSDN文档
我还检查了Visual Studio文档本身,它本身就是模糊不清的.
我甚至检查了这个网站:
最后,我发现这个主题有一个类似的问题,但问题页面和里面的引用 都没有这个图标.谢谢你的帮助.
我迟到对Win32党和有功能如海_tprintf
,TEXT()
外,还有库,例如strsafe.h
其中有这样的功能,如StringCchCopy()
,StringCchLength()
等.基本上,Win32 API中引入了大量额外的功能和类型上的C其顶部可能会让一个没有使用Win32的C程序员感到困惑.我在MSDN上找到这些类型和函数的定义没有问题.但是,我确实在查找何时以及为何应该使用这些指南时遇到问题.
我有两个问题:
在使用Win32编程时,使用Microsoft在标准C之上提供的所有这些类型和特殊功能有多重要?废除所有标准C函数和类型并完全使用Microsoft包装器被认为是一种好习惯吗?
是否可以将标准C函数与这些Microsoft类型和函数混合使用?例如,使用malloc()
代替HeapAlloc()
,或使用printf()
而不是_tprintf()
等...?
我有一份Charles Petzold编程的Windows第五版书,但它主要涵盖了GUI的内容,而不是API的其余部分.
我正在尝试使用 Rust 中的一些堆数据启动一个新线程,但我收到了一堆错误,这些错误源于数据需要具有'static
生命周期。我已经按照我的方式倒退了我的程序,但遇到了问题。
use std::sync::Arc;
use std::thread;
struct ThreadData {
vector_of_strings: Vec<String>,
terms: Vec<&'static str>,
quotient: usize,
}
fn perform_search(slice: &[String], terms: &[&str]) {
/* ... */
}
fn threaded_search(td_arc: &Arc<ThreadData>) {
let no_of_lines = td_arc.vector_of_strings.len();
let new_tda1 = td_arc.clone();
let strings_as_slice1 = new_tda1.vector_of_strings.as_slice();
thread::spawn(move || {
perform_search(&strings_as_slice1[0..td_arc.quotient], &new_tda1.terms);
});
}
fn main() {
let td = ThreadData {
vector_of_strings: Vec::new(),
terms: Vec::new(),
quotient: 0,
};
let td_arc = Arc::new(td);
threaded_search(&td_arc);
}
Run Code Online (Sandbox Code Playgroud)
错误:
use std::sync::Arc;
use std::thread;
struct …
Run Code Online (Sandbox Code Playgroud) 我在 Linux x86_64 上编程。我运行readelf -S ./mybinary
并看到 Go 编译器将这两个名为.gopclntab
和 的部分.gosymtab
放入二进制文件中。看来至少.gopclntab
在运行时没有必要。我偶然发现这篇文章证实了这一点:
\n\n不幸的是,使用 cgo 的 Go 二进制文件没有这些 Go ELF\n部分。正如构建更好的 Go 链接器中提到的:
\n对于可能任意使用 C 库的 \xe2\x80\x9ccgo\xe2\x80\x9d 二进制文件,\nGo 链接器将所有 Go 代码链接到单个本机对象文件\n然后调用系统链接器来生成最终的二进制文件。
\n
显然,这些对于程序正常运行来说并不是严格必要的。但是,该strip
实用程序不会删除它们,可能是因为它不知道这些特定于 Go 的部分。请注意,即使我使用go build -ldflags="-s -w"
,这些部分仍然存在。
有没有办法将它们从使用中剥离出来cgo
?