我该怎么办才能不使用GPL许可证窃取“ Hello World”代码?


42

在项目中,我找到了一个文件math.c,其中包含一个很大的GPL标头,并且...

//------------------------------------------------------------------------------
/// Returns the minimum value between two integers.
/// \param a  First integer to compare.
/// \param b  Second integer to compare.
//------------------------------------------------------------------------------
unsigned int min(unsigned int a, unsigned int b)
{
    if (a < b) {
        return a;
    }
    else {
        return b;
    }
}

好吧,很酷,所以我需要获取最小值并... 这个文件!因此,我需要为此打开整个项目吗?还是我需要重新发明数学?

我不认为这只是疯狂,所以问题是:什么时候才能删除GPL标头?

我一定要成为一个怪人吗?

unsigned int min(             unsigned int
JEIOfuihFHIYEFHyigHUEFGEGEJEIOFJOIGHE,
unsigned int hyrthrtRERG            ) {  if
(JEIOfuihFHIYEFHyigHUEFGEGEJEIOFJOIGHE
< hyrthrtRERG            ) {  return JEIOfuihFHIYEFHyigHUEFGEGEJEIOFJOIGHE;  }
else {return hyrthrtRERG            ;    } }

说真的,他们是否要我编写上述代码?


22
好吧,在Google与Oracle的最新案例中the jury did find that one nine-line function that Google acknowledged copying was infringing(来自ArsTechnica)。
泽农

5
Aww来吧,认真吗?
Mircea Chirea

33
我想说这个问题的存在
真是

4
复制它。诸如此类的琐碎功能min不受版权保护。有关详细信息,请参见我的答案。

6
@Loki,您错过了一英里。算法受专利保护,不受版权保护。版权在作者去世后70年到期,因此60年代享有版权的作品仍然很新鲜。最后,问题是关于复制此代码,而不是算法。
亚历克西斯

Answers:


53

与这里的许多用户不同,我只是建议:复制它!

确保代码的格式符合您的编码标准,并且还应该删除或重写注释。没有人会知道您复制了它-当一段代码如此简单时,您可能还应该从头开始编写它。如果您的编码标准以某种方式要求该函数看起来与代码片段中的代码完全相同,那么就可以了-只要它看起来像您从头开始编写时一样。

想想看,这几乎不是第一次写这个精确的片段-如果有些琐碎的事情,如果您不想自己写,就没有理由不复制它。

即使进行此讨论对我来说也是多余的-如果我们要完成任何实际工作,我们需要务实!


5
真正的问题是,琐碎和非琐碎之间的障碍在哪里,有没有办法绝对确保人们不会用“看起来是我的GPL最小实现!”之类的东西来指向我的代码。我真的很害怕那些人> _ <
cnd 2012年

20
嗯,版权中有原创阈值的概念。而且,这种简单的方法几乎不应享有版权。IANAL,但是,司法管辖区也有所不同。尽管如此,每个CS本科生至少以完全相同的方式写了五遍的东西很可能属于这种情况。
2012年

4
@nilu:Let us then say that the programmer wrote his own version of MIN and it ended up looking exactly like the one from math.c - would it then be okay?是的,如果是意外的话。“如果他刚刚复制了书,那将会有什么不同?” 钻头有颜色ansuz.sooke.bc.ca/entry/23这不是大多数计算机科学家都能理解的东西-确实是一个复杂的话题,但这是法律认可的东西。如果您对某些事情是否合法存有疑问,最好与律师交谈
马克·拜尔斯

4
@alexis:我理解您的观点,但我并不完全同意-如果生成的代码相同,那么除了程序员之外,没人可以知道它是从头复制还是编写的。显然,实现min应该没有什么麻烦,并且可能比找到另一种实现要花更少的时间。但是,如果程序员确实确实复制了它,而没有人知道他自己还没有编写函数,那么会造成什么损害呢?除非程序员感到某种“内gui”,否则答案是没有。剩下的仅仅是语义。
nilu 2012年

5
@MarkByers:当我说“无法证明”时,我的意思是说,不存在任何物理证据来证明甚至已实施了犯罪-实施的犯罪完全限于程序员的意识。显然,如果某些糖果被盗,情况就不会如此-这对世界产生了物理影响(棒棒糖-= 1)。如果“犯罪”只限于您自己的想法,谁来判断这是道德的还是不道德的?
nilu 2012年

18

它不会直接回答您的问题,请尝试以下操作:

#define min(a,b) ((a) < (b) ? (a) : (b))

我在此向公共领域发布这个辉煌而复杂的宏。尽管我可能必须发表有关该技术的论文。

如果您对宏有恐惧感,请尝试以下内联版本(确实,除非您在SPARC上进行编码,否则不将函数包装为min输入/退出代码中的普遍性,这样可以节省很多CPU周期):

inline int min(int a, int b)
{
    return a < b ? a : b;
}

琐碎代码片段的代码许可问题确实有点令人讨厌。请咨询律师,但我很想假设他们实际上并没有获得许可和/或在实践中不能强制执行许可。就像您不能为“单词”一词添加版权或商标一样,然后依靠使用它的人们。(糟糕)


1
噢,他们当然可以对该代码进行版权保护,但是鉴于算法的简单性,除非您做了一些愚蠢的事情(如完整保留左注),否则很难在法庭上证明您已复制了该代码。规则不是您可以不要使用相同的代码,规则是,只有当您用自己的大脑编写代码并且不以任何方式复制原始代码时,您才能这样做。
Gort机器人2012年

2
@StevenBurnap当然,原始代码也会有同样的问题:它们可以证明自己具有版权(即,他们没有从较早的实现中复制它)吗?
理查德

19
当您尝试执行min的宏版本时会出现问题min(a++,b++)

4
“将此...发布到公共领域”是非常以美国为中心的。在许多国家,这并不意味着同一件事,实际上在某些国家中这是不可能的。

9
谢谢,但是在2000年代的编译器上,编译器可以内嵌琐碎的功能,例如min
DeadMG 2012年

18

免责声明:我不是律师。使用我的建议需要您自担风险。

这种实现min没有版权的,因为只有写它的极少数合理的方式。

在法律界,这被称为合并学说(也称为观念表达鸿沟)。据说该功能的(非版权)思想已经与(可能受版权保护的)表达 “合并” 。因此,该代码不受版权保护-您可以自由使用它。

为了安全起见,请勿逐字复制。对变量使用不同的名称,使用自己的格式,不要一字不漏地复制注释。该代码的确切字面意思可能受版权保护。

请记住,这不能保证有人不会起诉您,但至少您会拥有强有力的辩护。

另外,请记住,即使一段代码不受版权保护,它也可能仍受软件专利保护(您的min功能并非如此)。


2
您尝试告诉Oracle!
GordonM 2012年

1
也许9行功能并不简单 ……我想看一下代码。

1
假设那是正确的代码,对于我来说,programmers.stackexchange.com / a / 148362/28718似乎微不足道。
GordonM

12

我将根据BSD许可发布以下代码。由于该许可更宽松,因此,如果使用我的实现,则不应遇到版权问题。

unsigned int min(unsigned int a, unsigned int b)
{
    return (a > b? b: a);
}

我如何确定您不密封该GPL代码并重写它?:P(开玩笑)
2012年

1
你不是。但是,如果您使用了我的代码,则可以声明您是真诚地使用它的。
GordonM

3
弟兄们,随着新时代的来临而欢喜-我们现在可以min在封闭源代码软件中找到。另外,@ Sholy,无论是否复制,这都是GordonM的问题。
K.Steff

5
您还将在“知识共享”下发布它。有关粘贴在此处的代码,请参见本页底部。
马丁·约克


11

我同意这是一种荒谬的情况,但你只能怪自己。如果您正在编写专有代码,则不应阅读GPL许可的源文件。从文件系统中删除math.c,保留文档,并随时重新实现所需的API的任何部分。如果您不阅读代码,则无需担心自己的代码是否相似。

浪费,你说?GPL故意阻止您从免费代码中受益,而无需回馈生态系统。如果您不能满足或不满足其条款,并且又不想实现另一个数学库,则可以随时购买一个数学库或找到一个免费的带有许可的图书馆。

微软的程序员不允许阅读开放源代码,以保护公司免受法律问题的侵害。出于纯粹出于道德原因,您应该对不打算遵守其许可证的任何程序执行相同的操作。

您没有使用该权限的权利math.c,但是没有人试图垄断市场的实现min。GPL的目标是增加程序员的“自由度”(以及最终用户的自由度),而不是限制它。GNU许可证,FSF和自由软件运动始于Richard Stallman,而Stallman首先是从头开始重新实现Symbolics lisp的每个新版本。FSF不会(也不能)要求任何人重新实现GPL库。


因此,这确实是一个奇怪的例子。例如,这意味着我必须阅读并遵循它。但是据我了解,我可以自由选择此处的GPL许可证。所以我知道谁是斯托曼;)
cnd

2
不好意思,对不起,但我不知道你在说什么!什么例子 (您是否也在问我Stallman是谁?用Google搜索。还是只查看Wikipedia。)
Alexis 2012年

3
“不允许Microsoft的程序员阅读开放源代码”噢,我的那太可怕了–在我能读到的任何地方吗?Google没有帮助。
Amara

好问题。我在一个Iron Python开发论坛上阅读了有关它的信息,但不幸的是我现在找不到它。简介:Jim Hugunin(hugunin.net/microsoft_farewell.html)提到不允许他们查看python实现,有人开玩笑地询问是否允许他们查看自己的代码(Microsoft已将Iron Python开源) 。答案是:他们为Iron Python设置了一个特殊例外。
Alexis 2012年

GPL旨在增加自由度的人们是程序的所有用户,而不是(特别是)程序员。
James Youngman

7

答:只有得到作者的明确许可。

那是受版权保护的代码。未经作者许可,您不能复制它。

您将必须编写自己的版本min,或复制min使用其他许可证的变体。

请记住,拥有版权的是受保护的代码,而不是算法。版权法来自文本。即使“ math.c”只是注释而已,根本没有可执行代码,它仍然会受到版权保护。


1
什么是自己的版本?MIN的MY OWN版本,听起来很有趣!
2012年

2
请记住,您不拥有min,而是拥有恰好实现的特定字符序列min
Gort机器人2012年

2
未经作者许可,您完全不能更改它,只能用于个人用途。您必须从头开始重写它。这就是重点。请注意,如果您坐在空白的编辑器上并写了几乎与之相同的内容,那是很好的,因为您没有复制它。(假设您不是从内存中键入内容的。)
弄乱了机器人的功能

2
不,我不是在开玩笑。是的,在这种情况下,您可能可以摆脱它。版权持有者必须证明自己已经完成。请注意,我只是告诉您法律是什么,而不是为法律辩护。
Gort机器人2012年

3
因为如果您不对这些琐碎的事情进行重新编码,那么您正在使用别人的工作,而这种方式是他们未得到您许可的。如果它太琐碎以至于您不需要它,请不要使用它。
亚历克西斯

6

据说,这就是Google所窃取的东西。对于数组,这似乎是常识。

 908     /**
 909      * Checks that fromIndex and toIndex are in range, and throws an
 910      * appropriate exception if they aren't.
 911      *
 912      * @param arrayLen the length of the array
 913      * @param fromIndex the index of the first element of the range
 914      * @param toIndex the index after the last element of the range
 915      * @throws IllegalArgumentException if fromIndex > toIndex
 916      * @throws ArrayIndexOutOfBoundsException if fromIndex < 0
 917      *         or toIndex > arrayLen
 918      */
 919     private static void rangeCheck(int arrayLen, int fromIndex, int toIndex) {
 920         if (fromIndex > toIndex)
 921             throw new IllegalArgumentException("fromIndex(" + fromIndex +
 922                        ") > toIndex(" + toIndex+")");
 923         if (fromIndex < 0)
 924             throw new ArrayIndexOutOfBoundsException(fromIndex);
 925         if (toIndex > arrayLen)
 926             throw new ArrayIndexOutOfBoundsException(toIndex);
 927     }

如果仅此而已,则判决将在上诉时被撤销。但是根据《连线》杂志,法官还发现Google复制了另外8个文件。参见wired.com/wiredenterprise/2012/05/google-oracle-decompile

5
是的,但是“常识”并不是版权的标准。这是他们是复制还是编辑,还是从头开始编写。某种东西是否具有“常识”是对专利而不是版权的检验。换句话说,Oracle可以对该文本进行版权保护,但是他们不能对该算法申请专利。
Gort机器人2012年

这9行是合并学说的经典例子。还有什么其他方法可以对阵列执行范围检查?

1
@TonythePony,很多,如果函数抛出包含文本消息的异常。
2012年

4
很少有人提到在Google上复制此文本的人也是在Sun上编写该文本的人。程序员必须意识到,疯狂的胡须极端分子Stallman是正确的。金钱是万恶之源,使人们忘记了为什么他们首先参与技术。:-/
HostileFork,2012年

5

无论如何,我不会使用此代码,因为注释与该代码不匹配。讨论的是注释integer,而代码使用unsigned int。谁知道此功能的深度掩盖了什么错误?

严重的是,这是“不要重新发明轮子”的荒谬之处,而您却忘了带上一粒盐。只需从头开始编写您自己的版本,使其与代码的命名约定和样式指南(例如math_min_uint(x, y))相匹配,确保它可以工作(单元测试或其他任何操作),并且继续存在并且没有版权问题。

随着经验的不断增长,您一次又一次地需要这些琐碎的代码片段就在您的工具箱中,您无需过多思考就可以重写它们,或者只是从您自己的库中获取它们。


2

人们似乎已经忘记了版权法,无论是在文字上还是在文字上,都意味着禁止实际复制的行为-并不是自己表达相同思想的行为,即使结果可疑地相似。

如果您采用GPL的代码,对其进行修改,以违反获得其许可的方式使用它,并声称它不是衍生作品,那么您就是在违法。即使您使用第二个版本-您已经更改了所有变量的名称,并更改了格式,但是它仍然是原始版本的。

但是,如果您编写自己的版本 min,并且由于任务的琐碎性,那么您可以明智地编写此类内容的方法有很多,这有点巧合,那么您的版本最终将完全相同到GPL代码,那么您还没有复制任何内容。

不过,这两个故事是否会在法庭上通过是另一回事。如果更大或更复杂的代码示例出现在其他地方,并带有注释,格式和拼写错误,那么您将很难说服自己独立编写的任何人,如果可以证明您知道原始语言,则将更加困难。来源(鉴于您已将其发布在此处的事实,应该是相当琐碎的)。


1

如果该代码确实像“最小”示例那样微不足道,则很有可能其他人已经在不同的开源许可证下实现了相同的功能。

根据许可证的不同,您很可能被允许将代码包含在您的封闭源代码中。


1

只需30秒即可自己编写。您可以使用完全相同的算法。只是不要复制/粘贴。

版权仅保护思想的表达,而不保护思想本身。如果您不复制该想法,则可以直接使用该想法。

FWIW,我怀疑复制如此琐碎的代码是否会给您带来麻烦。损害赔偿金为零,在大多数司法管辖区都可能属于合理使用范围。但是法律案件是如此痛苦,以至于我不想冒险。


1

作为其GPL代码,这里的主要问题是您打算对代码进行篡改还是出售软件。

如果您仅在内部使用它,则GPL可以让您完全自由地进行操作。

如果您打算分发软件包,最简单的方法就是按照与您使用的任何GPL来源相同的条款对软件包进行GPL。还有其他方法,但是变得复杂。

如果您打算出售软件,则必须分发您使用和/或在获得GPL许可的同一GPL许可下修改的任何GPL代码的源代码。


0

如果您使用的是C ++而不是C,请使用标准库std::minstd::max中的来回避此问题<algorithm>

http://www.cplusplus.com/reference/algorithm/min/

这样可以买到通用性,并且适用于任何可比较的类型。另外:当任何d-bag试图声称自己发明了它并受到软件专利的保护时,他们都会在ISO委员会中喧...不是您。

在一般情况下,请注意谁发布了代码。公司,还是理智的个人?如果这是一个理智的个人(与许多开源软件一样),请给他们写一个漂亮的笔记并获得许可。保存他们的回答说没关系。问题解决了。


-2

对于一般情况:与min和max(可能或可能不具有版权)相比,更复杂的代码绝对具有版权。

然后按照库即GPL许可您的代码!但是请注意,有LGPL库(以及GPL除外),可让您使用它们的实现,同时为您的代码提供所需的许可证。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.