最近有东西,想在linux下实现,实践过程中,发现了这样一个问题:
linux与windows的地址越界保护有很大的不同。
例如一个录入矩阵的C程序:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int **array,a,b,i,j;
scanf("%d",&a);
while(a!=-1){
scanf("%d",&b);
array=(int **)malloc(sizeof(int *)*a);
for(i=0;i<a;i++){
*(array+i) = (int*)malloc(sizeof(int)*b);
for(j=0;j<b;j++){
scanf("%d",(*(array+i)+j+1000));//!!!
printf("%d ",*(*(array+i)+j+1000));//!!!
}
printf("\n");
}
scanf("%d",&a);
}
}
接受输入:
2 3 //矩阵大小 2X3
1 2 3
4 5 6
输出:
1 2 3
4 5 6
重点在于程序中的叹号注释处,我给地址加了1000的偏移量。
在windows下写了很久代码了,这种情况肯定是越界了,但是linux下却没有问题,运行的很好。当然,并不是linux没有断错误之类的越界概念,只是在程序的私有地址空间等方便的概念上,可能与win是不同的。
现在的问题是:
我在做一个web的编译器,并且可以用来运行用户提交的程序,然而如果这样的win型错误可以在linux下运行正确的话,程序的行为就不一致了。
后记:
我想,这可能是和内存的管理有关系。Linux应该是基于段页式的内存管理方案,按照一般操作系统知识来说,4KB每页是比较常见的吧。所以,一个这样的c程序,可能只分配到1个页,根据内存的映射原理来说,位于这个页内的地址都会是程序的合法地址,事实上,也许程序根本用不了4Kb这么大的空间~ 所以,没有发生越界,看来是很合理的解释。
分享到:
相关推荐
Windows程序调试涉及多种技术和工具,旨在确保软件的质量和稳定性。以下是对这一主题的详细阐述: 1. **调试器**: Windows调试的核心工具是调试器,如Microsoft的Visual Studio Debugger和WinDbg。这些工具提供了...
而在Microsoft Windows系统中,访问无效内存的进程会收到STATUS_ACCESS_VIOLATION异常。 #### 2. Segment fault的发生机理 Segmentation fault通常是由于程序尝试访问未分配给它的内存空间所导致的。在Linux环境下...
7. **跨平台支持**:尽管本例中提到的是Windows环境下的`GetModuleHandle`,但源码定位工具往往也需要支持其他操作系统,如Linux或macOS,这就需要理解和应用不同平台的调试技术。 使用CrashFinder这样的工具,...
在ubuntu linux中,程序使用build-essential环境编译,需要下载gfortran。 f2c是一个开源的fortran到c的转换软件,如果不想混合编程的话,可以用它。 ============================================= 这是1976年...
3. **信号的选择**:在Linux中,当程序出现非法内存访问时,操作系统会发送SIGSEGV信号而非SIGILL信号(非法指令)。这是因为非法内存访问通常是由软件错误引起,而非法指令则可能涉及硬件问题或恶意代码。 #### 四...
### Windows 下 C++ 内存泄露检测工具使用详解 ...总之,无论是 Windows 平台上的 VLD 还是 Linux 平台上的 Valgrind,都是非常有价值的工具,能够帮助开发者有效解决内存管理问题,提高软件的质量和性能。
2. **Visual Studio Debugger**:针对Windows平台的集成开发环境中的调试工具,提供了图形用户界面,便于初学者使用。 3. **LLDB**:苹果公司开发的一款调试器,适用于Mac OS和iOS平台。 4. **Valgrind**:主要用于...
6. **软件安装与管理**:Linux使用包管理器(如apt-get for Debian/Ubuntu, yum/dnf for Red Hat/CentOS)来安装、更新和卸载软件,这与Windows或Mac OS有很大不同。 **C语言编程** 1. **C语言基础**:C语言是一种...
这款工具在Windows和Linux平台上都有相应的版本,适用性广泛。 **一、CppCheck的基本功能** 1. **语法错误检测**:CppCheck能够检查代码中的语法错误,如非法的操作符组合、缺失的分号、未闭合的括号等。 2. **...
在IT行业中,Qt是一个广泛应用的跨平台开发框架,主要用于创建桌面、移动以及嵌入式应用程序。这个名为"Crash_Qt5.9.1.zip"的压缩包文件显然是与使用Qt 5.9.1版本进行开发时遇到的程序崩溃问题有关。下面,我们将...
在ubuntu linux中,程序使用build-essential环境编译,需要下载gfortran。 f2c是一个开源的fortran到c的转换软件,如果不想混合编程的话,可以用它。 ============================================= 这是1976年...
实验环境通常包括个人计算机,安装有操作系统(如Windows或Linux),以及相应的汇编语言开发工具,如MASM(Microsoft Macro Assembler)、NASM(Netwide Assembler)或调试器(如OllyDbg、GDB等)。这些工具为编写、...
Nginx在反向代理站点的时候,通常会将一些文件进行缓存,特别是静态文件。缓存的部分存储在文件中,每个缓存文件包括“文件头”+“HTTP返回包头”+“HTTP返回包体”。如果二次请求命中了该缓存文件,则Nginx会直接将...
xlnt库支持多平台,包括Windows、Linux和MacOSX等操作系统。xlnt库可以直接在C/C++应用程序中使用,也可以通过插件和脚本语言(如Python)进行访问。xlnt支持多种数据类型的读写,包括字符串、数字、日期、公式和布尔...
- 课程介绍了一些关于程序如何编译和运行的知识,并提供了一些程序示例。 以上知识点覆盖了从C语言编程基础到数据结构实现,再到编程环境设置和调试技巧的各个方面,为学习者提供了一个全面的C语言编程和数据结构...
Qt是一个跨平台的应用程序开发框架,支持多种操作系统,如Windows、Linux、macOS等,使得开发人员能够构建高性能、用户友好的图形界面应用程序。 在这款平台中,Qt库被用来构建图形用户界面(GUI),包括视频显示...
Ini文件是一种常见的配置文件格式,尤其在Windows系统和一些跨平台的应用程序中广泛使用。它以文本形式存储数据,通常包含多个节(section)和键值对(key-value pairs),结构简单,易于读写。本项目提供了一个在...
10. 内存调试技巧:在开发驱动程序时,使用内存调试工具如Windows的KD debugger或Linux的Valgrind可以帮助发现内存管理问题,如泄漏和越界访问。 通过对以上知识点的学习和实践,开发者能够编写出更加高效、稳定且...