`
shwan
  • 浏览: 11621 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Linux 与windows平台中关于程序越界的一些发现

阅读更多
最近有东西,想在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这么大的空间~ 所以,没有发生越界,看来是很合理的解释。
分享到:
评论
1 楼 mikeandmore 2009-12-26  
这么小的chunk都是在prealloc里的,很难有保护的。
windows应该也是。只不过运气好吧。

PS这和编译器提供的crt也有关系

相关推荐

    Windows程序调试

    Windows程序调试涉及多种技术和工具,旨在确保软件的质量和稳定性。以下是对这一主题的详细阐述: 1. **调试器**: Windows调试的核心工具是调试器,如Microsoft的Visual Studio Debugger和WinDbg。这些工具提供了...

    linux c段错误处理

    而在Microsoft Windows系统中,访问无效内存的进程会收到STATUS_ACCESS_VIOLATION异常。 #### 2. Segment fault的发生机理 Segmentation fault通常是由于程序尝试访问未分配给它的内存空间所导致的。在Linux环境下...

    程序崩溃源码定位

    7. **跨平台支持**:尽管本例中提到的是Windows环境下的`GetModuleHandle`,但源码定位工具往往也需要支持其他操作系统,如Linux或macOS,这就需要理解和应用不同平台的调试技术。 使用CrashFinder这样的工具,...

    IEEE_电气工程师_数字信号处理_FORTRAN程序库-4

    在ubuntu linux中,程序使用build-essential环境编译,需要下载gfortran。 f2c是一个开源的fortran到c的转换软件,如果不想混合编程的话,可以用它。 ============================================= 这是1976年...

    Segmentation_fault_in_linux.pdf

    3. **信号的选择**:在Linux中,当程序出现非法内存访问时,操作系统会发送SIGSEGV信号而非SIGILL信号(非法指令)。这是因为非法内存访问通常是由软件错误引起,而非法指令则可能涉及硬件问题或恶意代码。 #### 四...

    windows下c++内存泄露检测工具使用方

    ### Windows 下 C++ 内存泄露检测工具使用详解 ...总之,无论是 Windows 平台上的 VLD 还是 Linux 平台上的 Valgrind,都是非常有价值的工具,能够帮助开发者有效解决内存管理问题,提高软件的质量和性能。

    c++程序调试使用手册

    2. **Visual Studio Debugger**:针对Windows平台的集成开发环境中的调试工具,提供了图形用户界面,便于初学者使用。 3. **LLDB**:苹果公司开发的一款调试器,适用于Mac OS和iOS平台。 4. **Valgrind**:主要用于...

    Linux C编程一站式学习

    6. **软件安装与管理**:Linux使用包管理器(如apt-get for Debian/Ubuntu, yum/dnf for Red Hat/CentOS)来安装、更新和卸载软件,这与Windows或Mac OS有很大不同。 **C语言编程** 1. **C语言基础**:C语言是一种...

    Crash_Qt5.9.1.zip

    在IT行业中,Qt是一个广泛应用的跨平台开发框架,主要用于创建桌面、移动以及嵌入式应用程序。这个名为"Crash_Qt5.9.1.zip"的压缩包文件显然是与使用Qt 5.9.1版本进行开发时遇到的程序崩溃问题有关。下面,我们将...

    IEEE_电气工程师_数字信号处理_FORTRAN程序库-2

    在ubuntu linux中,程序使用build-essential环境编译,需要下载gfortran。 f2c是一个开源的fortran到c的转换软件,如果不想混合编程的话,可以用它。 ============================================= 这是1976年...

    汇编程序调试实验报告.doc

    实验环境通常包括个人计算机,安装有操作系统(如Windows或Linux),以及相应的汇编语言开发工具,如MASM(Microsoft Macro Assembler)、NASM(Netwide Assembler)或调试器(如OllyDbg、GDB等)。这些工具为编写、...

    xlnt一个用于读写Microsoft Excel 2007及更高版本(XLSX格式)文件的C++库,本次资源windows下的

    xlnt库支持多平台,包括Windows、Linux和MacOSX等操作系统。xlnt库可以直接在C/C++应用程序中使用,也可以通过插件和脚本语言(如Python)进行访问。xlnt支持多种数据类型的读写,包括字符串、数字、日期、公式和布尔...

    CppCheck 码缺陷静态检查工具

    这款工具在Windows和Linux平台上都有相应的版本,适用性广泛。 **一、CppCheck的基本功能** 1. **语法错误检测**:CppCheck能够检查代码中的语法错误,如非法的操作符组合、缺失的分号、未闭合的括号等。 2. **...

    有关C语言中数据结构和编程技术的说明Notes on Data Structures and Programming Techniques in C

    - 课程介绍了一些关于程序如何编译和运行的知识,并提供了一些程序示例。 以上知识点覆盖了从C语言编程基础到数据结构实现,再到编程环境设置和调试技巧的各个方面,为学习者提供了一个全面的C语言编程和数据结构...

    QT视频监管平台

    Qt是一个跨平台的应用程序开发框架,支持多种操作系统,如Windows、Linux、macOS等,使得开发人员能够构建高性能、用户友好的图形界面应用程序。 在这款平台中,Qt库被用来构建图形用户界面(GUI),包括视频显示...

    一个INI文件解析程序

    Ini文件是一种常见的配置文件格式,尤其在Windows系统和一些跨平台的应用程序中广泛使用。它以文本形式存储数据,通常包含多个节(section)和键值对(key-value pairs),结构简单,易于读写。本项目提供了一个在...

    033驱动中的内存管理.7z

    10. 内存调试技巧:在开发驱动程序时,使用内存调试工具如Windows的KD debugger或Linux的Valgrind可以帮助发现内存管理问题,如泄漏和越界访问。 通过对以上知识点的学习和实践,开发者能够编写出更加高效、稳定且...

    FIR线性相位滤波器设计程序

    在ubuntu linux中,程序使用build-essential环境编译,需要下载gfortran。 f2c是一个开源的fortran到c的转换软件,如果不想混合编程的话,可以用它。 ============================================= 这是1976年...

    IEEE_电气工程师_数字信号处理_FORTRAN程序库-3

    在ubuntu linux中,程序使用build-essential环境编译,需要下载gfortran。 f2c是一个开源的fortran到c的转换软件,如果不想混合编程的话,可以用它。 ============================================= 这是1976年...

Global site tag (gtag.js) - Google Analytics