精华内容
下载资源
问答
  • 堆栈溢出

    2021-03-23 18:11:06
    事实上,堆和栈是不同的数据结构概念,堆栈溢出也可细化为堆溢出和栈溢出两种。栈有两个特性:只能从栈的顶端存取数据;数据的存取符合后进先出的原则。所谓后进先出,其实就如同自助餐中餐盘在桌面上一个一个往上...

    一、原理

    事实上,堆和栈是不同的数据结构概念,堆栈溢出也可细化为堆溢出和栈溢出两种。栈有两个特性:只能从栈的顶端存取数据;数据的存取符合后进先出的原则。所谓后进先出,其实就如同自助餐中餐盘在桌面上一个一个往上叠放,在取用时先拿最上面的餐盘,这是典型的堆栈概念的应用。 堆是一种树结构,准确地说是一个完全二叉树。
    在内存中,当一个可执行程序被装入到内存时,主要包括两个部分 :代码和数据。代码会被装入到内存中的代码区,数据区又由 3 部分组成 :①全局变量:根据其是否有初始值,被装入到内存中的未初始化数据区和初始化数据区;②局部变量:在函数调用发生时存放在栈中;③动态内存空间:在程序运行时申请的动态内存空间存放在堆中。
    栈区(stack)是后进先出的结构,向低地址进行扩展,是一块连续的内存区域,栈顶的地址和栈的最大容量是系统预先规定的,只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常来提示栈发生溢出。栈空间是系统自动分配、释放的,存放函数的参数值、局部变量的值等。一般来说,进栈的顺序首先为主函数中的下一条指令(函数调用语句的下一条可执行语句)的地址先进栈,其次是参数由右往左依次进栈,最后是函数中的局部变量进栈,出栈顺序与进栈顺序相反,对于程序来说,出栈就意味着函数执行完毕,函数空间将被系统完全释放掉。
    堆区一般由程序员自己申请,并指明大小,程序最后进行释放,若程序员不释放,程序结束时可能由操作系统回收(注意,如果是C/C++语言,程序不进行对空间回收,而Java语言中有专门的垃圾回收器进行回收),堆区与数据结构中的堆有所不同,分配方式类似于链表。堆区向高地址扩展。

    二、原因分析

    1、 堆栈尺寸设置过小
    2、递归层次太深或函数调用层次过深导致堆栈溢出
    3、动态申请空间使用之后没有释放

    展开全文
  • Java堆栈溢出背景知识:栈存放什么:栈存储运行时声明的变量——对象引用(或基础类型, primitive)内存空间, 栈的实现是先入后出的。堆存放什么:堆分配每一个对象内容(实例)内存空间。栈溢出:java.lang....

    Java堆栈溢出

    背景知识:

    栈存放什么:栈存储运行时声明的变量——对象引用(或基础类型, primitive)内存空间, 栈的实现是先入后出的。

    堆存放什么:堆分配每一个对象内容(实例)内存空间。

    栈溢出:java.lang.StackOverflowError

    堆溢出:java.lang.OutOfMemoryError: Java heap space

    栈溢出实现,可以递归调用方法,这样随着栈深度的增加,JVM 维持着一条长长的方法调用轨迹。

    堆溢出实现,可以循环创建对象或大的对象;

    直到内存不够分配,产生栈溢出。

    栈溢出

    两种情况:

    • 线程请求的栈深度大于虚拟机允许的最大深度 StackOverflowError

    • 虚拟机在扩展栈深度时,无法申请到足够的内存空间 OutOfMemoryError

    堆溢出

    创建对象时如果没有可以分配的堆内存,就会出现堆溢出。

    两者实例如下:

    import java.util.ArrayList;

    import java.util.Arrays;

    import java.util.List;

    import java.util.Scanner;

    public class testCode {

    public void testHeap(){//堆溢出

    List list = new ArrayList<>();

    int i=0;

    while (true){

    list.add(new byte[5*1024*1024]);

    System.out.println("count is: "+(++i));

    }

    }

    int num = 1;

    public void testStack(){ //栈溢出

    num++;

    this.testStack();

    }

    public static void main(String[] agrs){

    testCode t = new testCode();

    t.testHeap();

    t.testStack();

    }

    }

    运行结果:

    //堆溢出:

    count is: 343

    count is: 344

    count is: 345

    count is: 346

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

    at testCode.testHeap(testCode.java:14)

    at testCode.main(testCode.java:25)

    //栈溢出:

    StackOverflowError

    • 1

    • 2

    另外,Java虚拟机的堆大小如何设置:命令行

    java –Xms128m //JVM占用最小内存

    –Xmx512m //JVM占用最大内存

    –XX:PermSize=64m //最小堆大小

    –XX:MaxPermSize=128m //最大堆大小

    • 1

    • 2

    • 3

    • 4

    • 5

    • 6

    展开全文
  • 但是,由于windows用户进程地址空间分配和堆栈处理有其独立的特点,导致了windows环境下堆栈溢出攻击时,使用的堆栈溢出字符串,与unix下的,区别很大。另外,windows的版本也导致了windows下的exploit不具有通用性...

    文本由 www.169it.com 搜集整理

    windows下的堆栈溢出攻击和unix下的,原理基本相同。但是,由于windows用户进程地址空间分配和堆栈处理有其独立的特点,导致了windows环境下堆栈溢出攻击时,使用的堆栈溢出字符串,与unix下的,区别很大。另外,windows的版本也导致了windows下的exploit不具有通用性。windows版本不同,而exploit使用了很多动态链接库里面的库函数,其地址都是与dll的版本有关系的。不同的dll版本,里面的库函数的偏移地址就可能(注意:是可能)不同。因为windows的patch天天有,他的一些dll就更新很快。甚至可能不同语言版本的windows,其核心dll的版本都不同。用户的dll一变更,那么,我们的exploit里面的shellcode就要重新写。

    为了解决这个问题,我想我们可以尽量减少固定地址的使用。即,使用GetProcAddress来获得我们将使用的每一个系统函数,当然这就大大加长了我们的shellcode。但是,这也无法消除对kernel32.dll的中LoadLibrary和GetProcAddress的地址的直接引用,因为这两个是shellcode中最基本的函数,自然就导致了对kernel32.dll版本的依赖。

    一、利用VEH

    向量化异常处理(VEH,Vectored Exception Handling)最初是在XP中公布,它的优先级高于SEH,并且VEH是存在堆中的,它是你在代码中明确添加的,并不伴随try/catch之类的语句而产生,它也需要通过API(AddVectoredExceptionHandler)来注册回调函数,并可注册多个VEH,各个VEH结构体之间串成双向链表,因此比SEH多了一个前??指针,其它更详细的信息可参考《Windows XP中的向量化异常处理》一文:http://bbs.pediy.com/showthread.php?t=49868。每一个VEH结构均存储在堆上,其结构如下:

    负责分发_VECTORED_EXCEPION_NODE的代码如下:

    接着我们在堆中确定shellcode地址,可先用垃圾字符去填充,比如‘0x41‘,然后在堆中搜索它。当发生堆溢出时,堆块的前向指针和后向指针就会被篡改,比如异常出现在:

    那么我们就可以用m_pNextNode-4来覆盖ECX,然后用shellcode-8去覆盖EAX。关于m_pNextNode指针的获取,我们只需在触发异常后,按shift+F7步过异常即可找到此指针,比如以下代码:

    关于EAX和ECX的偏移地址可通过pattern_create和pattern_offset来获取。这样当触发异常时就会调用VEH,而此时下一个VEH结构即是我们特意构造的shellcode,这样我们的恶意代码就有可以被执行了。

    二、利用UEF

    系统默认异常处理函数(UEF,Unhandler Exception Filter)是系统处理异常时最后调用的一个异常处理例程,在堆溢出中,只需将这一地址覆盖为我们的shellcode地址即可。获取UEF地址的方法可以通过查看SetUnhandledExceptionFilter()的代码来定位,接着再找到操作UnhandledExceptionFilter指针的MOV指令,比如以下代码:

    现在我们只需找到shellcode地址,或者看是否有某一寄存器reg刚好指向shellcode或其附近,然后用shellcode地址或者类似call [reg + offset]的指令地址来覆盖UnhandledExceptionFilter指针,比较常用的指令如:

    其它eax,ebx也有可能指向堆,亦可作为跳板来用。

    三、利用PEB

    由于当UEF被调用后,它最终会调用ExitProcess()来结束程序,而它在清理现场时需要进入临界区以同步线程,因此会调用RtlEnterCriticalSection()t和RtlLeaveCriticalSection()。ExitProcess是通过存放在PEB中的一对指针来调用这两个函数的,如果能够利用DWORD SHOOT把这对指针篡改成shellcode入口地址,那么在程序结束调用ExitProcess()就会执行shellcode。下面是在Windows XP SP3下PEB的情况:

    但在WinXP SP2之后微软就加入了PEB random保护,不再使用固定的PEB基址,而使用具有一定随机性的PEB基址,以提高利用的难度。

    四、Heap Spary

    Heap Spary技术最早是由SkyLined于2004年为IE的iframe漏洞写的exploit而使用到新技术,目前主要作为浏览器攻击的经典方法,被大量网马所使用。Heap Spary技术是使用js分配内存,所分配的内存均放入堆中,然后用各带有shellcode的堆块去覆盖一大片内存地址,Javascript分配内存从低址向高址分配,申请的内存空间超出了200M,即大于了0x0C0C0C0C时,0x0C0C0C0C就会被覆盖掉,因此只要让IE执行到0x0C0C0C0C(有时也会用0x0D0D0D0D这一地址)就可以执行shellcode,这些堆块可以用NOP + shellcode 来填充,每块堆构造1M大小即可,当然这也不是固定。这样当nop区域命中0x0c0c0c0c时,就可执行在其后面的shellcode。下面是一个简单模板:

    五、Bitmap Flipping Attack

    在 Heap Management 结构中包含有Freelist Bitmap标志位,它是一个4字节的DWORD值,当对应的FreeList[n]被填充时,bitmap就将被设置。当请求分配堆块时,它会先搜索与之大小合适的FreeList[n],然后检测对应的bitmap,若上面为0就表示上面是块未使用的空闲块,则对应的FreeList[n]将用于分配配块,接着返回到对应的请求块FreeList[n]指向的地址。因此如果我们可以控制Bitmap,并能够覆盖freelist[n]中的值,那么我们就可以通过它来执行任意代码。

    六、Heap Cache Attack

    Heap Cache主要用于降低频繁遍历FreeList[0]的性能消耗,以提高性能。它主要是为FreeList[0]中的堆块创建扩展索引,更重要的是,Heap Manager并没有将任何空闲块移动缓存中,这些空闲块一直保存在FreeList[0]中,但缓存中保存着一些指针,它们指向FreeList[0]中的某些节点,以此来提升访问FreeList[0]的速度。堆缓存是一个bucket数组,每一个bucket包含有intptr_t字节用于存储大小,还有一个NULL指针或者FreeList[0]上的堆块指针。默认情况下,数组包括有896个bucket,其大小在1024和8192之间,但大小是可配置的,我们可指定最大的缓存索引号。在堆缓存攻击技术中又存在各种利用方式,比如De-synchronization Attack(通过覆写堆块头信息中的大小域,使每次请求同等大小堆块时都指向同一块已经使用的内存块,如果攻击者可能控制这一内存块中的内容,就有可能导致任意代码执行),Insert Attack、Existing Attacks、Malicious Cache Entry Attack……这些方法有很大的局限性,在实际运用上很难派上用场,若想获取更多关于这方面的信息可以参见BlackHat USA 2009上面的文章《Practical Windows XP/2003 Heap Exploitation》。

    七、Bitmap XOR Attack

    Bitmap XOR Attack 是通过异或操作来更改 freelist bitmap,如果系统尝试清除这一错误的标志位,那么就可能从一个空闲位(free bit)切换到设置位(set bit),进而实现类似上文提到的bitmap attack。这个可以通过篡改堆块头信息中的大小域(CurSize),使其小于0x80,接着再使对应堆块中的前向指向与后向指针相等(flink == blink),并保证其指向的地址是可读的。更多信息可以参见BlackHat USA 2009上面的文章《Practical Windows XP/2003 Heap Exploitation》。后面这几种方法实际利用价值不大,权当了解,学习思路更为重要。

    原文:http://my.oschina.net/u/1766067/blog/339994

    展开全文
  • 内存溢出和堆栈溢出Stack Overflow is an incredible collection of programming and software knowledge. Thousands of students and developers use it daily to lookup answers for questions they can’t solve ...

    内存溢出和堆栈溢出

    Stack Overflow is an incredible collection of programming and software knowledge. Thousands of students and developers use it daily to lookup answers for questions they can’t solve easily themselves. Stack Overflow taught me so much over the years, I have used it since I began to learn to program. It’s built and grown by a community of developers, with new questions and answers being added all the time.

    堆栈溢出是令人难以置信的编程和软件知识的集合。 每天有成千上万的学生和开发人员使用它来查找自己无法轻松解决的问题的答案。 多年来,Stack Overflow教会了我很多东西,自从我开始学习编程以来,我就一直使用它。 它由开发人员社区构建和发展,并始终添加新的问题和答案。

    However, contributing to Stack Overflow, asking questions and answering them, is vastly different from just searching and reading information on the site. Stack Overflow has a very steep learning curve, for a long time, it wasn’t really welcoming toward beginners. If you are interested in using it to grow and further your skills or reputation as a developer, this article is for you. On a site like Stack Overflow, there is no right or wrong, all content will eventually be moderated by the community. Yet, you will want to avoid situations where despite good intentions, you get downvoted to oblivion.

    但是, 促成堆栈溢出,提出问题和回答问题与仅在站点上搜索和读取信息有很大不同。 长期以来,Stack Overflow的学习曲线非常陡峭,对初学者并不那么受欢迎。 如果您有兴趣使用它来发展自己,并提高自己作为开发人员的技能或声誉,那么本文适合您。 在Stack Overflow之类的网站上,没有对与错,所有内容最终都将由社区管理。 但是,您将希望避免尽管有良好的意愿但又被遗忘的情况。

    目的 (The Purpose)

    When people start using Stack Overflow, they often don’t fully understand the purpose of the site. Stack Overflow is not a discussion site or a forum. It’s a knowledge base. That means for whatever questions are asked, any answer should be accurate, specific, and useful to the highest degree. It’s not a place to post partial answers or to ask questions on questions. Answers are upvoted and downvoted to determine the communities opinion on them. There’s one, critically, crucially important detail to understand about upvotes and downvotes: Roughly 80% of all votes on Stack Overflow are downvotes.

    当人们开始使用Stack Overflow时,他们通常并不完全了解该站点的用途。 堆栈溢出不是讨论站点或论坛。 这是一个知识库。 这意味着,无论提出什么问题,任何答案都应准确,具体且在最大程度上有用。 这不是发布部分答案或提出问题的地方。 回答是否正确,可以确定社区对此的看法。 有一个非常关键,非常重要的细节需要了解有关投票和降票的信息:关于Stack Overflow的所有选票中大约有80%是投票。

    In fact, there’s even some users with hundreds of thousands in points that have an up to down vote ratio of over one to one thousand. That means for every one up vote they gave, they also gave over a thousand down votes. This isn’t meant to scare you, it’s to help you understand Stack Overflow does have a high standard of quality for content. Even the best answers also get their share of down votes. Any answer you give should have careful thought and effort put into it.

    实际上,甚至有些用户拥有数十万的点数,其最高投票率超过一千。 这意味着他们每投票一票,他们也会投票一千票。 这并不是要吓you您,而是要帮助您了解Stack Overflow确实具有高标准的内容质量。 即使是最佳答案,也将得到他们的反对。 您给出的任何答案都应该经过认真的思考和努力。

    Being a knowledge oriented site can also imply there’s no room for subjectivity. To an extent that’s true, but it’s more complicated than that. Whether or not something is considered subjective depends on how much information exists on that particular problem, or if there is a widely accepted solution. For example, a question asking “How to add more items to a list in Python?” could only be reasonably answered by suggesting to use the append or insert methods of a Python list. An answer giving a solution by construction an entirely new list, would likely be heavily downvoted. That’s because a list in Python is designed for mutability, answers diverting from that use will simply not be useful or welcomed.

    作为一个面向知识的网站,也可能意味着没有主观性。 在一定程度上是对的,但要复杂得多。 是否认为某件事是主观的,取决于有关该特定问题的信息量或是否存在被广泛接受的解决方案。 例如,一个问题询问“如何在Python中将更多项目添加到列表中?” 只能通过建议使用Python列表的append或insert方法来合理地回答。 通过构造一个全新的清单来给出解决方案的答案可能会被严重否决。 这是因为Python中的列表是为可变性而设计的,从该用法中转移出来的答案将根本无用或不受欢迎。

    Asking “How to ensure a particular module is only imported from a certain directory?” is a question that’s more open to interpretation and does not have a widely accepted methodology. A simple answer to such a question would be to suggest inserting the directory path at the beginning of sys.path . Although that answer works, it’s still not full proof. The Python interpreter actually checks sys.modules before it checks sys.path . There’s also a completely different way to achieve the same desired behavior, to run Python in a virtual environment, avoiding conflicts between module names altogether. The point is, there’s multiple ways to answer such a question, given any answer accurately argues for itself.

    “如何确保特定模块仅从特定目录导入?” 这个问题更易于解释,没有广泛接受的方法论。 一个简单的答案就是建议在sys.path的开头插入目录路径。 尽管该答案有效,但仍不是完整的证据。 Python解释器实际上检查sys.path 之前先检查sys.modules 。 还有一种完全不同的方式来实现相同的期望行为,以便在虚拟环境中运行Python,从而完全避免模块名称之间的冲突。 关键是,给定任何答案都可以正确辩解的情况,有多种方法可以回答这样的问题。

    Next, look at both the best, and worst ways you can use Stack Overflow to grow and improve as a developer.

    接下来,研究使用Stack Overflow作为开发人员来成长和改进的最佳和最差方法。

    最差 (Worst)

    As mentioned previously, there’s no wrong way to use Stack Overflow. Yet, there are many pitfalls and traps you can avoid to prevent being heavily downvoted. These are those patterns of contribution you will want to avoid.

    如前所述,使用堆栈溢出没有错误的方法。 但是,您可以避免很多陷阱和陷阱,以防止被严重否决。 这些就是您希望避免的贡献模式。

    问简单的问题 (Asking simple questions)

    Most simple questions are likely to be closed as duplicates on Stack Overflow. This happens to questions that are usually have a solution found easily in a language’s or package’s documentation. While this won’t subtract points from your total score on the site, it’s just a waste of time since you won’t get your question upvoted. Both questions and answers can be voted on, up votes in either case increase points, while down votes decrease them. Try to search if you question exists before you ask it.

    大多数简单问题很可能会作为Stack Overflow上的重复项关闭。 这通常发生在通常在语言或软件包的文档中很容易找到解决方案的问题上。 尽管这不会从您在网站上的总得分中减去分数,但这只是浪费时间,因为您不会提出自己的问题。 可以对问题和答案都进行投票,无论哪种情况,都可以提高投票数,而减少投票则可以降低分数。 询问之前,先尝试搜索是否存在问题。

    Keep in mind, sometimes questions are mistakenly marked as duplicates. This can be because you weren’t clear enough on the specific answer or knowledge you sought. Good news, Stack Overflow allows you to edit a question and reopen it if this happens, netting you more points if that edit is better received.

    请记住,有时问题被错误地标记为重复。 这可能是因为您对所寻求的具体答案或知识不够清楚。 好消息,Stack Overflow允许您编辑问题并在出现这种情况时将其重新打开,如果更好地接受了此编辑,则可以为您赢得更多的分数。

    提供与问题不符的答案 (Giving answers that don’t match the question)

    This might sound obvious, whatever answer you contribute should be suited for the question being asked. Stack Overflow enforces a rather strict interpretation of this rule, though. Submitting an answer which suggests a solution that either doesn’t fully resolve the problem, or uses a different tool or method than what’s specified, is highly frowned upon, and will result in downvoting. This is probably the absolute worst way to use Stack Overflow.

    这听起来似乎很明显,无论您提供什么答案都应该适合所提出的问题。 但是,堆栈溢出强制对此规则进行了相当严格的解释。 提交的答案表明解决方案不能完全解决问题,或者使用的工具或方法与指定的方法不同,因此对此表示强烈的反对,这将导致投票失败。 这可能是使用堆栈溢出的绝对最糟糕的方法。

    An example can be as follows. There is a question, “How to get the stderr from a process with Popen?”. You answer, “This can be accomplished using subprocess.run and accessing the stderr attribute of the return value”. This answer would be considered inappropriate for the question, because it’s specifying the use of a different builtin object the question is not asking about. Stack Overflow is not a discussion forum, and such answers are not useful or desirable on that particular question.

    一个例子可以如下。 有一个问题, “如何从使用Popen的进程中获取stderr?”。 您将回答: “这可以使用subprocess.run并访问返回值的stderr属性来完成”。 该答案将被认为不适合该问题,因为它指定使用该问题未询问的其他内置对象。 堆栈溢出不是讨论论坛,并且这样的回答对于该特定问题没有用或不希望有。

    用热门标签回答问题 (Answering questions with highly popular tags)

    Questions on Stack Overflow are organized by tags relating to the specific topic of software development they are concerned with. The site holds tens of thousands of tags, encompassing every topic you can think of. The most popular of which are general programming language tags, such as [javascript] or [python] . The most popular tags have hundreds of thousands, if not millions of questions listed under them. While you may see a lot of questions that feel easy to answer, there are some substantial risks.

    关于堆栈溢出的问题按与他们所关注的软件开发特定主题相关的标签来组织。 该网站拥有成千上万个标签,涵盖了您可以想到的每个主题。 其中最受欢迎的是通用编程语言标签,例如[javascript][python] 。 最受欢迎的标签下有成千上万个问题,即使不是数百万个问题。 尽管您可能会觉得很多问题很容易回答,但存在一些重大风险。

    Remember the user I mentioned that gives over a thousand downvotes per one up vote? Users similar to that are likely top contributors and lurking in popular tags. Answers you give to questions under these tags will be under high scrutiny. Additionally, many questions in such tags get answered very quickly, as many people are also looking at them. By the time you write a well thought out answer, some top contributor may have already answered it before you. Or, your answer or code may miss small details involved in answering the question, leading to a higher degree of downvotes. Generic, language syntax type of questions are frequently marked as duplicates, so you may start putting effort toward an answer for nothing.

    还记得我提到过的用户,每一次投票就有一千多票的赞成票吗? 与此类似的用户可能是最主要的贡献者,并且潜藏在流行标签中。 您对这些标签下的问题的回答将受到严格审查。 另外,此类标签中的许多问题很快就会得到回答,因为很多人也在看它们。 当您编写一个经过深思熟虑的答案时,某些杰出贡献者可能已经在您面前回答了。 或者,您的答案或代码可能会错过回答问题所涉及的小细节,从而导致更高的否决率。 通用的语言语法类型的问题经常被标记为重复项,因此您可能会开始全力以赴地寻求答案。

    最好 (Best)

    These strategies and tips are meant to help you achieve the most up votes with the least down votes.

    这些策略和技巧旨在帮助您获得最多的赞成票而最少的反对票。

    用不太受欢迎的标签回答问题 (Answering questions in less popular tags)

    In less popular tags, such as [csv] or [bson] , questions stay unanswered for much longer periods of time. Such tags also have far less super contributors (reputation > 100k) you have to compete with. There’s also less intensive, harsh moderation going on. I am by no means suggesting that moderation is bad or counterproductive. On the contrary, it’s what builds Stack Overflow as a community. However, not all moderation is conducive to increases in quality.

    在不太受欢迎的标签(例如[csv][bson] ,问题会在更长的时间内保持未回答状态。 这样的标签所具有的超级贡献者(声誉> 100k)也要少得多。 另外,强度较低,苛刻的调节正在进行中。 我绝不暗示节制是有害的或适得其反。 相反,这是将Stack Overflow建立为社区的原因。 但是,并非所有节制措施都有助于提高质量。

    I wrote this answer to a question I had asked which to my surprise, no one answered. I explained the solution and all the needed steps for others to implement it if they found themselves in a similar situation. Yet, my answer was still downvoted, due to using a different, yet equivalent keyword argument in the setup function for a Python package. There’s no difference in behavior between the two argument fields, but was still marked down by the community. If I were to write that question again, I wouldn’t include the [python] tag.

    我写了这个答案回答了一个我很惊讶的问题,没有人回答。 如果他人发现自己处于类似情况,我将解释该解决方案以及所有其他实施该解决方案所需的步骤。 但是,由于在Python程序包的设置函数中使用了一个不同但等效的关键字参数,我的回答仍然不理想。 这两个参数字段之间的行为没有差异,但仍被社区标记。 如果我要再次写下该问题,则不会包含[python]标记。

    提出没有明显解决方案的问题 (Asking questions with no obvious solution)

    The best questions to ask, and the ones that will get the most upvotes, are the ones with no obvious solution. This doesn’t mean super complex questions almost no one can answer or solve. Questions that concern a common situation, but that have no easily identifiable or straight forward solution, are the ones you need to be asking.

    最好的问题是那些没有明显解决方案的问题,它们将获得最多的投票。 这并不意味着几乎没有人能够回答或解决的超级复杂问题。 您需要提出的问题涉及一个常见情况,但没有容易识别或直接解决的问题。

    I have question that I asked five years ago that has since gotten over 50,000 views. The question asks how to match a particular string against many different possible strings using regular expressions. Generally, checking if a string is present in a group of strings can be accomplished with a hash set. But in the case of regex, there is no widely used method. One option, which turned out as the best answer, is using a list of words joined with the| “or” operator in regex. Another option, the second answer listed, is using named lists from a common third party library for regular expressions. Both answers work fine, but the former doesn’t depend on any other packages, it uses native Python.

    我有一个问题 ,我五年前问过,自那以后获得了50,000多次浏览。 该问题询问如何使用正则表达式将特定字符串与许多不同的可能字符串进行匹配。 通常,可以使用哈希集完成检查字符串组中是否存在字符串。 但是对于正则表达式,没有广泛使用的方法。 事实证明,这是最好的选择,其中一个选项是使用带有|的单词列表。 正则表达式中的“或”运算符。 另一个选择是列出的第二个答案,它使用来自公共第三方库的命名列表进行正则表达式。 两个答案都可以正常工作,但是前者不依赖于其他任何软件包,它使用本机Python。

    The lesson here is asking questions with no direct or straight forward answers are more likely to be upvoted, and more likely to generate answers.

    此处的课程是询问没有直接或直接答案的问题,更可能被否决,并且更有可能产生答案。

    结论 (Conclusion)

    Overall, Stack Overflow is an immense body of knowledge that’s built by a vast community of developers. Using it is easy, contributing to it isn’t that easy. However, if you put careful thought into your answers, stick to less popular tags, and try to ask more complex questions, you will gain a lot more out the experience.

    总体而言,堆栈溢出是由大量开发人员构建的大量知识。 使用它很容易,贡献它并不是那么容易。 但是,如果您对答案进行仔细的思考,坚持使用不太受欢迎的标签,并尝试提出更复杂的问题,您将获得更多的体验。

    翻译自: https://medium.com/swlh/the-best-and-worst-ways-to-use-stack-overflow-711a077f2892

    内存溢出和堆栈溢出

    展开全文
  • 堆栈是一个在计算机科学中经常使用的抽象数据类型。堆栈中的物体具有一个特性: 最后一个放入堆栈中的物体总是被最先拿出来, 这个...堆栈溢出的产生是由于过多的函数调用,导致调用堆栈无法容纳这些调用的返回地址...
  • 内存溢出和堆栈溢出About a year ago, we launched our community forum. Today, thousands of campers use it each day to share insights and get help. 大约一年前,我们启动了社区论坛。 今天,成千上万的露营者...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,907
精华内容 2,362
关键字:

堆栈溢出