Is the second law 'broken'?  

Maybe that's just where computational logic and the English language don't mix?

The below logic may be a bit buggy and/or inefficient but is an interpretation of how the first 'law' could work while  explaining the behaviour of the robot in question.  

When the Law1 function is called, the robot analyses the conditions of all humans in some list (all humans that it's aware of maybe); It assesses the severity of danger that they are in and compares those; then if there are multiple humans in similar (highest found) severities of danger, it compares each of those humans and determines which is most likely to be successfully helped; And so long as at least one human needs to be protected from harm, law2 is not executed.

    Private Sub UpdateBehavior (ByVal humans As List(Of Human), _
                ByVal humanOrders As List(Of Order), ByVal pDangers As List(Of pDanger))
      Dim bBusy as boolean
      bBusy = False
      Law1(humans)
      If Not bBusy Then Law2(humanOrders)
      if Not bBusy Then Law3(pDangers)
    Exit Sub

    Private Function Law1 (ByVal humans As List(Of Human)) As Boolean
    Dim human as Human
    Dim targetHuman as Human
      Try
        Set targetHuman = Nothing
        'loop listed humans
        For Each human In humans 
          If human.IsInDanger() Then
            'Enumerate 'danger' into predetermined severities/urgencies
            '(eg. Danger of going-hungry > falling-over > being-stabbed)
            'and compare
            If targetHuman.DangerQuantification() < human.DangerQuantificationThen()
              'If the comparison human's amount of danger is discernibly greater
              'make that human the new target
              Set targetHuman = human
            'Where both humans are in equal quantifiable amounts of danger
            Else If targetHuman.DangerQuantification() = human.DangerQuantification() then 
              'CompareValueOfHumanLife() 'Can-Of-Worms INTENTIONALLY REMOVED!
              If rescueSuccessRate(human) > rescueSuccessRate(targetHuman)
                'Target the human where rate of successful harm prevention is higher
                Set targetHuman = human
              End If
            End If
          Else
            'Set the first human found to be in danger as the initial target
            targetHuman = human
          End If
        Next human
        If Not targetHuman Is Nothing then
          Law1 = True
          Rescue(TargetHuman)
        else
          Law1 = False
        End If
        AvoidHarmingHumans()
      catch
        initiateSelfDestruct()
      end try
    End Function

So did the robot break the second law?  Some people might say "The robot acted contrary to the plain English definition of the law ant therefore it was broken."  while some other people might say "The laws are just functions.  Law1 was executed.  Law2 was not.  The robot obeyed its programming and the second law simply did not apply."